为什么 foreach 跳过接口类型的编译时类型检查?

2024-01-07

当我使用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(使用前将#替换为@)

为什么 foreach 跳过接口类型的编译时类型检查? 的相关文章

随机推荐