[英]C# foreach unexpected behavior
為什么 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)
,因為Test
不能是string
- 但Test
可以是IDisposable
,因為它可以引用實現IDisposable
的Test
子類的實例。 如果您使Test
類密封,即使使用IDisposable
也將無法編譯,因為這樣Test
實例就無法實現IDisposable
。
基本上,如果從Test
到迭代類型的強制轉換可以編譯,它將編譯,否則將無法編譯。 但是如果正常的轉換在執行時也會失敗,它也會在執行時失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.