2017-11-30 201 views
8

C# kod parçasıdırVS hata ayıklama sorunu, bunu aşağıda açıklamama yardımcı olabilecek kim?

var isTrue = (new List<int>{1,2,3} is IEnumerable<object>); 

ben kod çalıştırma, sonucu false var ama ben İZLE penceresine kodu, sonuç true olduğunu kopyaladığınızda.

+1

IEnumable'ın bir yazım hatası olduğunu mu sanıyorum? – casiosmu

+0

[Covariance & Contra-variiance arasındaki fark] 'ın olası kopyası (https://stackoverflow.com/questions/2184551/difference-between-covariance-contra-variance) –

+0

TL; DR: a 'List ' 'IEnumerable 'değil, IENumerable '. 'yanlış' doğru sonuçtur. –

cevap

0

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.

+0

Evet ID IDE penceresinde şüpheli bir uyarı var. –