2010-05-10 25 views
9

C# derleyicisinin, örtük olarak tümünün dolaylı olarak dönüştürülebilecekleri bir türe göre bir dizi yazacağı izlenimindeydim.Arabirimleri uygulayan dizilerin örtülü yazımı

derleyici dolaylı yazılan dizide bulunamadı iyi tip üretir

public interface ISomething {} 

public interface ISomething2 {} 

public interface ISomething3 {} 

public class Foo : ISomething { } 
public class Bar : ISomething, ISomething2 { } 
public class Car : ISomething, ISomething3 { } 

void Main() 
{ 
    var obj1 = new Foo(); 
    var obj2 = new Bar(); 
    var obj3 = new Car(); 

    var objects= new [] { obj1, obj2, obj3 }; 
} 

Bunu düzeltmek için bir yol gibi türünü ilan etmek olduğunu biliyoruz:

new ISomething [] { obj1, ...} 

Ama Kapakların altından bir sonra buraya yardım edin.

+0

olabilir? –

cevap

14

C# derleyici belirtilen tüm öğelerin türlerini dikkate alır. Bu değil vb ortak baz türlerini dikkate alır

Sen olabilir ifadeler birini dökme:

var objects= new [] { obj1, obj2, (ISomething) obj3 }; 

... ama şahsen ben sadece açık formunu kullanmayı tercih ediyorum:

var objects= new ISomething[] { obj1, obj2, obj3 }; 

Alternatif olarak, obj1, obj2 ve obj3 türlerinin herhangi birini veya tamamını ISomething olarak bildirdiyseniz, dizi başlatma ifadesini değiştirmeden de iyi çalışın. C 3. spec kaynaktan

, bölüm 7.5.10.4:

üçüncü formunun bir dizi oluşturma ifadesi adlandırılan bir dolaylı yazılmış bir dizi oluşturma ifade olarak. ikinci forma benzerdir, ancak dizinin dizisi öğesinin açıkça belirtilmemiş, ancak dizi başlatıcısındaki ortak türünün (§7.4.2.13) kümesinin en iyi olarak belirlendiği belirtilir.

Bölüm 7.4.2.13 böyle görünüyor: Bazı durumlarda

, ortak bir tip gereken ifadelerin kümesi için çıkarılabilir. Özellikle, örtük olarak yazılan dizilerin öğe türleri ve blok gövdeli anonim işlevlerin dönüşü bu şekilde bulunur. Sezgisel, ifadeler E1 verilen bir dizi ... Em Bu çıkarım argüman olarak bir yöntemini Ei ile

Tr M<X>(X x1 … X xm) 

çağırmak aynıdır olmalıdır. Daha açık olarak, sonuç bir sabitlenmemiş tip değişken X Çıkış tipi çıkarsamalar sonra son olarak, X, sabitlenir X tipi her Ei gelen çekilmiş olan başlar ve sonuçta elde edilen S tipi için elde edilen sık olduğu ifadeleri. Skeet bu cevabına hafif ek olarak

3

Örneklerin tümü herhangi bir örnek türüne yayınlanabilirse, bu türden daha fazla kullanılır. Tüm örneklerin ortak bir türü olması yeterli değildir, ya da implicity dizisi başlatma her zaman başarılı olur ve çoğu zaman istenmeyen new object[] dizileri oluşturur.

0

: Eğer bu tür sadece tek eleman olsaydı

Ya (bu durumda arayüzde) ihtiyacınız türüne dizi öğelerinden birini döküm veya edebilirsiniz (türetmek değil, doğrudan bir tür). Böyle

public static IWindsorInstaller[] MobileRestComponentInstallers 
     { 
      get 
      { 
       return new [] 
          { 
           new RepositoryInstaller(), 
           new AppSettingsInstaller(), 
           // tens of other installers... 
           GetLoggerInstaller() // public IWindsorInstaller GetLoggerInstaller()... 
          }; 
      } 
     } 

olarak bu çalışacaktır, ancak pls :) Sadece dizi türünü tanımlamak ve new[]new IWindsorinstaller[] geçmek bunu yapma. Dizi tipinin açıkça tanımlanmış olması daha okunabilir.

0
Do like this for Class object(UIViewController) initialization in var array: 



var page1 = new Class1(); 
var page2 = new Class2(); 
var pages = new UIViewController[] { page1, page2 }; 

Not: Burada UIViewController derleyici eşleşen bir türünü bulmak için çalışmaz neden olduğu gibi herhangi bir sınıf