Neden C# farklı iki int dizi sözdizimi davranır
C dizi#örtülü olarak başvuru türü üzerinde co-varyant:
object[] listString = new string[] { "string1", "string2" };
Ama değerini yazın, eğer int
string
değiştirirseniz hata derlenmiş alacak kadar değil:
object[] listInt = new int[] {0, 1}; // compile error
Şimdi, endişe olduğunda bildirmek int
dizisi gibi, iki sözdizimi aşağıda olmayan açıkça ilan türü int
, sadece ayırt new[]
, derleyici verecek farklı:
object[] list1 = { 0, 1 }; //compile successfully
object[] list2 = new[] {0, 1}; //compile error
object[] list1 = { 0, 1 };
başarıyla derlenmiş alacak, ama object[] list2= new[] {0, 1};
hata derlenmiş.
C gibi# derleyici davranır
object[] list1 = { 0, 1 };
gibi
object[] list1 = new object[]{ 0, 1 };
ama
object[] list2 = new[] { 0, 1 };
gibi
object[] list2 = new int[]{ 0, 1 }; //error because of co-variant
Neden C# derleyicisi, bu davada farklı bir şekilde davranır?
CEVAP
Derler sürümünü kullanırdizi başlatıcılist1
başlatılamadı. C# dili spec, §1.110 ("Dizi başlatıcılar") devletler:
Bir dizi başlatıcı değişken başlatıcı bir dizi oluşan, “{”ve “}” simgeleri ve ayrılmış “,” belirteçleri. kapalı Her değişken başlatıcı bir ifade veya bir durumda. çok boyutlu bir dizi, iç içe geçmiş bir dizi başlatıcı.
Bu bağlamda hangi dizi başlatıcı kullanılır dizinin türünü belirler başlatıldı. Dizi oluşturma ifadesi, dizi türü hemen başlatıcı önündeki veya algılanır dizi başlatıcı ifadeler. Bir alan veya değişken Bildirgede, dizinin türü, alan türü veya değişken. ilan etti.
Bir dizi başlatıcı bir alan veya değişken kullanıldığında Bildirge olarak
int[] a = {0, 2, 4, 6, 8};
sadece eşdeğer bir dizi oluşturma ifadesi için kısaltma
int[] a = new int[] {0, 2, 4, 6, 8};
Bu derleme gerektiği açıktır.
İkinci versiyonu bir açık kullanırJava'da ifadeoluşturmak için özellikle hangi derleyici söyleyin., §1.51.10.4 ("Dizi oluşturma ifadeleri") devletler:
Üçüncü form dizisi oluşturma bir ifadesi olarak adlandırılır örtülü olarak yazılan dizi yaratılış ifadesi. Bu benzer ikinci form, dizi öğesi türü değildir açıkça belirtilmiş, ama en yaygın türü (§1.50.2.14)olarak belirlendi dizi başlatıcı ifadeler kümesi.
Bu nedenle, ikinci versiyonu ile eşdeğerdir
object[] list2 = new int[] { 0, 1 };
Şimdi soru etkili olur "neden object[]
int[]
değiştirebilirim?" sorusu sonunda bahsettiğin gibi, sadece. Ve cevabı da basit, §1.109 içinde verilir ("Dizi kovaryans"):
Dizi kovaryans, özellikle dizileri kapsamaz değer türleri. Örneğin, dönüştürme
int[]
izni varobject[]
gibi muamele görmek.
Neden farklı davranır tamamlayıcı prin...
c neden initializer_list davranış için...
Neden yapar .4.0 bu dizi farklı tür NE...
Neden sıralanmamış bir dizi daha hızlı...
Neden&; dizi yineleme için... "* o kad...