簡體   English   中英

C# foreach 意外行為

[英]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 ,因為它可以引用實現IDisposableTest子類的實例。 如果您使Test類密封,即使使用IDisposable也將無法編譯,因為這樣Test實例就無法實現IDisposable

基本上,如果從Test到迭代類型的強制轉換可以編譯,它將編譯,否則將無法編譯。 但是如果正常的轉換在執行時也會失敗,它也會在執行時失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM