SORU
4 ŞUBAT 2011, Cuma


Liste<int> test = {1, 2, 3} - bir özellik ya da bir hata mı?

Bildiğiniz gibi, Listeler ile Dizi başlatma sözdizimini kullanmak için izin verilmez. Derleme zamanı hatası verecektir. Örnek:

List<int> test = { 1, 2, 3} 
// At compilation the following error is shown:
// Can only use array initializer expressions to assign to array types. 

Ancak bugün şunları yaptım (çok basitleştirilmiş):

class Test
{
     public List<int> Field;
}

List<Test> list = new List<Test>
{
    new Test { Field = { 1, 2, 3 } }
};

İyi derler yukarıda, ama çalıştırmak ne zaman verecek bu kodu bir "Nesne başvurularını bir nesne için ayarlı değil" çalışma zamanı hatası.

Bu kod derleme zamanı hatası vermesini beklerdim. Size sorum şu: Neden değil, ve böyle bir senaryo düzgün çalışır zaman için iyi bir sebep var mı?

Bu kullanılarak test edilmiştir .NET 3.5,.Net ve Mono faydalı olabilir.

Şerefe.

CEVAP
4 ŞUBAT 2011, Cuma


Bu tasarım bir davranış olduğunu düşünüyorum. Test = { 1, 2, 3 } listesi Add yöntem Test alanında saklı çağıran kod derlenir.

NullReferenceException alma nedeninizi Test null. Eğer yeni bir liste için Test alan başlatılamıyor kod çalışır:

class Test {    
  public List<int> Field = new List<int>(); 
}  

// Calls 'Add' method three times to add items to 'Field' list
var t = new Test { Field = { 1, 2, 3 } };

Oldukça mantıklı - eğer new List<int> { ... } yazarsanız listeye yeni bir örneğini oluşturur. Eğer nesne inşaat ekleme yok eğer doğru değilse, varolan örneği (ya da null) kullanır. Görebildiğim kadarıyla,# spec C bu senaryoya uyan herhangi bir açık çeviri kural içermiyor, ama bir örnek (bkz . veriyor ^strong>Bölüm 7.6.10.3):

List<Contact> aşağıdaki gibi oluşturulmuş ve başlatılabilir

var contacts = new List<Contact> {
    new Contact {
        Name = "Chris Smith",
        PhoneNumbers = { "206-555-0101", "425-882-8080" }
    },
    new Contact {
        Name = "Bob Harris",
        PhoneNumbers = { "650-555-0199" }
    }
};

aynı etkiye sahip

var contacts = new List<Contact>();
Contact __c1 = new Contact();
__c1.Name = "Chris Smith";
__c1.PhoneNumbers.Add("206-555-0101");
__c1.PhoneNumbers.Add("425-882-8080");
contacts.Add(__c1);
Contact __c2 = new Contact();
__c2.Name = "Bob Harris";
__c2.PhoneNumbers.Add("650-555-0199");
contacts.Add(__c2);

__c1 __c2 geçici değişkenleri olduğu aksi görünmez ve ulaşılmaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • Caramthros

    Caramthros

    10 AĞUSTOS 2007
  • Emotional Trancer

    Emotional Tr

    4 Mart 2010