2009-10-26 4 views
24

Sabit Boyut beyan perspektifte için

IList<string> list= new string[3]; 
    list.Add("Apple"); 
    list.Add("Manago"); 
    list.Add("Grapes"); 

1) Bu ince derler izin Listeye, Ama çalışma zamanı i "Collection was of fixed size" hatası alıyorum. Tabaka, koleksiyona göre dinamik olarak büyütülen, neden böyle bir beyan, derleyici tarafından kabul edildi?

2) IList'e atayabileceğim farklı listeler nelerdir? Örnek sınıflar i IList atayabilirsiniz çeşitli toplama nelerdir

IList<string> fruits=new List<string>(); 
İşte

Ben IList Listesini atama ediyorum?

cevap

41

burada yatan sorun System.ArrayIList<T> uygulayarak ikame prensibi ihlal etmesidir. Bir System.Array tipi, değiştirilemeyen sabit bir boyuta sahiptir. IList<T>'daki Add yöntemi, temeldeki koleksiyona yeni bir eleman eklemeyi ve boyutunu 1'e kadar büyütmeyi amaçlamaktadır. Bu, System.Array için mümkün değildir ve dolayısıyla atar.

Gerçekten burada uygulamak istediğiniz System.Array gerçekten sadece IList<T> bir salt okunur stil uygulamak istiyor. Ne yazık ki, bu tür bir çerçeve mevcut değildir ve bu yüzden bir sonraki en iyi şeyi uygular: IList<T>.

Hangi türlerin IList<T>'a atanabileceği sorusuyla ilgili olarak, aslında aşağıdakiler de dahil olmak üzere birkaç tane vardır: ReadOnlyCollection<T> ve Collection<T>. Liste buraya koymak için çok uzun. Hepsini görmenin en iyi yolu, IList<T> reflektörde açmak ve türetilmiş türetilmiş IList<T> türlerini aramaktır.

+0

Sözlük , ICollection uygular, IList thecoop

+0

@ thecoop, iyi yakalama, güncelleştirildi – JaredPar

6

List.Add öğesini çağırdığınızda, dizinin sonuna bir öğe eklemeye çalışıyorsunuz. Diziler sabit boyutlu bir koleksiyon olduğundan, bir Add yapamazsınız. Bunun yerine dizinleyiciye aracılığıyla girdileri atamak zorunda kalacak:

list[0] = "a"; 
list[1] = "b"; 
list[2] = "c"; 
2

@Jake: Aslında bir string [] bir IList'e yüklenebilir ... ancak buna ADR yapamazsınız.

Listeyi önceden doldurmak istiyorsanız, o zaman olabilir kullanımı gibi bir şey:

IList<string> list= new string[3] { "Apple", "Mango", "Grapes" }; 

ama sonra bir IList bunun yapma amacı ne? Hala buna eklenemedin. Eğer gerçekten sabit boyutlu bir liste ise, o zaman bir dizgi [] yapın. Aksi halde, Jake'in önerdiği gibi onu bir Liste() yapın.