なぜ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を具象クラスで置き換えてもコンパイルされません。
うまくコンパイルできる私のフィドルによると:dotnetfiddle.net/3Up9nU
—
HimBromBeere
@HimBromBeere:はい、それが問題のポイントです。
—
Jon Skeet、
を使用して例外に
—
遭遇し
foreach (IDisposable item in list.OfType<IDisposable>())
Test
れない実装をIDisposable
。事実上、foreachはすべての要素をインターフェイスにキャストしようとし、失敗すると例外をスローします。書くのと同じ(IDisposable)currentElement
です。しかし、具体的なクラスでコンパイルしてはならない理由がわかりません。