Bu tam bir yanıt değil (bu hatanın neden kırpıldığını bilmiyorum), fakat hata ayıklayıcının düzensiz davranışlarına ışık tutacaktır.
Her şeyden önce: C# disallows (ve AFAIK, CLR de) tipi varyansı kapsayabilecek tipte değerler; dahil türleri arasında dönüşüm koruyarak bir kimlik varsa varyans yalnızca aksi takdirde başarısız olur, izin verilir (değer türleri için dönüşüm koruyarak hiçbir kimlik yoktur):
Ayıklayıcı'nın acil pencere besbelli yanlıştır
object[] oo = new int[] {1, 2, 3}; //will fail
IEnumerable<object> oo = new int[] {1, 2, 3}; //will fail
,
new List<int> { 1, 2, 3 } is IEnumerable<object>
dönmelidir Çalışma zamanı olarak
false
. Neden
true
dönüyor? Çünkü bir böcek var, dönem.
Ne daha da şaşırtıcı kılan int[]
List<int>
aynı IEnumerable<int>
örtük olarak dönüştürülebilir olduğunda new int[] { 1, 2, 3 } is IEnumerable<object>
false
dönmek correclty olacağı bir gerçektir.
Son doğru davranış için bulmamın tek nedeni, derleyici bu ifadeyi zaten bir uyarı ile her zaman false
olarak işaretler ve bu nedenle derleyicinin dizi senaryosunu analiz etme biçimi diğer IEnumerable
'dan farklıdır.
IEnumable'ın bir yazım hatası olduğunu mu sanıyorum? – casiosmu
[Covariance & Contra-variiance arasındaki fark] 'ın olası kopyası (https://stackoverflow.com/questions/2184551/difference-between-covariance-contra-variance) –
TL; DR: a 'List' 'IEnumerable 'değil, IENumerable