正如我在this帖子中提到的那样,我面临着一种无法理解的编译器行为。
代码:
IEnumerable<IList<MyClass>> myData = //...getMyData
foreach (MyClass o in myData){}
它可以编译,但是在运行时失败:InvalidCastException;对我来说很明显。
如果我将IList
更改为List
,它会抱怨:
IEnumerable<List<MyClass>> myData = //...getMyData
foreach (MyClass o in myData){}
当我将var
替换为类类型时,intellisense会识别正确的类型:
IEnumerable<List<MyClass>> myData = //...getMyData
foreach (var o in myData){}
我的第一个问题是:编译器为什么不抱怨?答案是行为符合C# Language definition。参见第116页的6.2.4显式引用转换。
阅读第4和第5条声明:
•从T的任何接口类型到T的任何类类型,只要未密封T或提供T实现S。
•从任何接口类型S到任何接口类型T,只要S不是从T派生的。
毫无疑问,第一条语句provided T implements S
的第二部分很清楚。
但是,如果我们将接口类型S转换为 any 类类型T,为什么会这样呢?是未派生的,还是未实施的?
在哪种情况下/非空列表情况下,代码将在不抛出InvalidCastException
的情况下运行?