C#语言规范的解释:6.2.4显式引用转换

时间:2018-12-03 09:52:53

标签: definition c#-5.0 explicit-conversion

正如我在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的情况下运行?

0 个答案:

没有答案