2010-04-21 8 views
5

Aşağıdaki 'x' neden dönüştürür, ama 'y' ve 'z' anlamıyorum. C# 4'ün kovaryansı jeneriklerin yuvalanmasını destekliyor mu?

var list = new List<List<int>>(); 

IEnumerable<List<int>> x = list; 
List<IEnumerable<int>> y = list; 
IEnumerable<IEnumerable<int>> z = list; 

yeni kovaryans özellik sadece jenerik jenerik çalışmıyor mu veya yanlış bir şey yapıyorum? (Ben y ve z çalışması için> .Cast < kullanmaktan kaçınmak istiyorum.)

cevap

7

"z" C# 4.0 içinde gayet, IEnumerable<T> eşdeğişkin olduğunu. Ancak, List<T>, "y" çalışmasını yapamazsınız. Öyle olsaydı

Sezgisel, o zaman bu geçerli olacaktır: "liste" sadece List<int> unsurları içerebilir bu sözü keser

List<IEnumerable<int>> y = list 
y.Add(new Stack<int>()); 

.

+0

Sorunun bir kısmı, 'z' benim için çalışmıyordu çünkü hala 3.5 seviyesini hedefliyordum. Hata. 'Y' üzerindeki açıklama için teşekkürler, işe yaramaz. – scobi

1

Burada birkaç hata yapıyorsunuz. İlk olarak, kovaryans ve kontravaryans değer türleri için desteklenmez, bu nedenle "int" ile yapmaya çalıştığınız her şey işe yaramaz.

İkincisi, iç içe jenerik tipte varyans kontrol geçerli bir örnektir daha şuna benzer:

var list = new List<List<String>>(); 
IEnumerable<IEnumerable<object>> z = list; 

Ben kovaryans olan nesnelerin IEnumerables ait IEnumerable için dizeleri listesi listesi atayabilirsiniz. Daha fazla bilgi için, Covariance and Contravariance FAQ'a bakın.