gpt4 book ai didi

C# foreach 意外行为

转载 作者:行者123 更新时间:2023-12-04 05:45:04 25 4
gpt4 key购买 nike

为什么 C# 编译器允许它编译并在运行时抛出运行时异常?

class Program
{
static void Main(string[] args)
{
IEnumerable<Test> list = new List<Test>() { new Test() };

foreach(IDisposable item in list)
{

}
}
}

public class Test
{

}

这确实可以使用任何接口(interface)进行编译,如果将 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)那不会编译,因为 Test不能是 string - 但是一个 Test可以是 IDisposable ,因为它可以引用 Test 的子类的实例实现 IDisposable .如果您制作 Test类密封,即使使用 IDisposable 也无法编译也是,因为那时一个 Test实例无法实现 IDisposable .

基本上,如果来自 Test 的类型转换,它将编译。迭代类型将编译,否则将无法编译。但是,如果正常转换在执行时也会失败,它也会在执行时失败。

关于C# foreach 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59394745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com