正如我在this https://stackoverflow.com/questions/53559287/c-sharp-foreach-on-ienumerableilistobject-compiles-but-shouldnt/发布后,我遇到了对我来说无法理解的编译器行为。
代码:
IEnumerable<IList<MyClass>> myData = //...getMyData
foreach (MyClass o in myData){}
它可以编译,但在运行时失败:InvalidCastException;对我来说这是显而易见的。
如果我改变IList
to List
它抱怨如下:
IEnumerable<List<MyClass>> myData = //...getMyData
foreach (MyClass o in myData){}
当我代替班级类型时var
如下所示,intellisense 识别出正确的类型:
IEnumerable<List<MyClass>> myData = //...getMyData
foreach (var o in myData){}
我的第一个问题是:为什么编译器不抱怨?答案是该行为尊重C# 语言定义 https://www.microsoft.com/en-us/download/confirmation.aspx?id=7029。请参阅第 116 页第 6.2.4 章显式引用转换。
阅读第四条和第五条声明:
• 从任何接口类型S 到任何类类型T,前提是T 不是密封的或者假设T 实现了S。
• 从任何接口类型S 到任何接口类型T,前提是S 不是从T 派生的。
对于第一个语句的第二部分provided T implements S
很清楚,没有疑问。
但是为什么我们可以将接口类型 S 转换为any类类型 T 如果是not派生或not实施的?
在这种情况下,具有非空列表的代码将在不抛出异常的情况下运行InvalidCastException
?
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)