SORU
9 Mayıs 2013, PERŞEMBE


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
9 Mayıs 2013, PERŞEMBE


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 var object[] gibi muamele görmek.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ColdfusTion

    ColdfusTion

    3 Aralık 2007
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • michal lelkowski

    michal lelko

    9 Temmuz 2006