当我使用foreach
在 C# 中的循环中,如果项类型是接口类型,则似乎不会执行编译时类型检查。
E.g.
class SomeClass {}
interface SomeInterface {}
IEnumerable<SomeClass> stuff;
foreach(SomeInterface obj in stuff) { // This compiles - why!?
}
这将愉快地编译并在运行时引发异常,而在编译时很清楚这是没有意义的。如果我将项目类型从SomeInterface
到另一个类,然后恢复编译时类型检查:
IEnumerable<SomeClass> stuff;
foreach(Random obj in stuff) { // This doesn't compile - good!
}
当项目类型是接口时,为什么没有编译时类型检查?
(Visual Studio 2008 中的 .NET 3.5 SP1 会出现这种情况)
在编译时尚不清楚程序的另一部分(可能在不同的项目中)是否具有:
class SomeOtherClass : SomeClass, ISomeInterface
{
public static IEnumerable<SomeClass> GetSomeStuff()
{
for( int i = 0; i<10; ++i)
yield return new SomeOtherClass(i);
}
}
现在运行时检查成功。
如果您标记SomeClass
as sealed
那么这是不可能的,并且再次有可能在编译时知道强制转换永远不会工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)