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
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.
iPhone - garip simülatörü üzerinde tes...
Yazmayı yasemin - bir Hata atılmayı be...
Git Uzantıları: Win32 hata 487:'ö...
hata: cannot çifti bir kullanıcı ile s...
ModelState.AddModelError - Ne'bir...