c# - C# foreach 意外行为
问题描述
为什么 C# 编译器允许它编译并在运行时抛出运行时异常?
class Program
{
static void Main(string[] args)
{
IEnumerable<Test> list = new List<Test>() { new Test() };
foreach(IDisposable item in list)
{
}
}
}
public class Test
{
}
这确实可以使用任何接口进行编译,如果将 IDisposable 替换为具体类,则不会编译。
解决方案
循环中foreach
有一个隐式转换。大致是这样的:
using (IEnumerator<Test> iterator = list.GetEnumerator())
{
while (iterator.MoveNext())
{
IDisposable item = (IDisposable) iterator.Current;
// Body of foreach loop here
}
}
回到泛型之前,这比必须在源代码中进行转换要方便得多。现在它不是那么重要了,但是不编译它会很奇怪。请注意,编译器将检查它是否至少可行。如果您使用foreach (string item in list)
that 将无法编译,因为 aTest
不能是string
- 但 aTest
可以是 an IDisposable
,因为它可以引用Test
该 implements的子类的实例IDisposable
。如果您将Test
类密封,即使使用 也将无法编译IDisposable
,因为Test
实例无法实现IDisposable
。
基本上,如果从Test
到迭代类型的转换可以编译,它将编译,否则将无法编译。但是,如果正常转换在执行时也会失败,它也会在执行时失败。
推荐阅读
- react-router - 输入 Route 而不将其添加到浏览器历史记录?
- vue.js - 在 vuex 流中运行脚本的正确位置?
- django - 如何更改根 URL 配置以便为用户 URL 使用命名空间
- android - 如何获得使用 MotionLayout 的障碍
- angularjs - “npm run dev”和“npm start”之间的区别
- reactjs - 在页面刷新之前,项目不会映射 - 使用 firestore、react 和 redux
- r - Shinyapps.io 服务器上的 data.table 错误,但不是本地错误
- ios - 当父母和孩子有相同的数据时,如何使用 Alamofire 解析数据?
- user-interface - wxPython dirpickerctrl 文本框出现在它自己的浏览按钮上
- r - 将制表符分隔的字符串转换为数据框