C# でループを使用するforeach
と、項目の型がインターフェイス型である場合、コンパイル時の型チェックが実行されないように見えます。
例えば
class SomeClass {}
interface SomeInterface {}
IEnumerable<SomeClass> stuff;
foreach(SomeInterface obj in stuff) { // This compiles - why!?
}
これは問題なくコンパイルされ、実行時に例外が発生します。コンパイル時に明らかな場合、これは意味がありません。項目の型SomeInterface
を別のクラスに変更すると、コンパイル時の型チェックが復元されます。
IEnumerable<SomeClass> stuff;
foreach(Random obj in stuff) { // This doesn't compile - good!
}
項目タイプがインターフェイスの場合、コンパイル時のタイプ チェックがないのはなぜですか?
(これは、Visual Studio 2008 の .NET 3.5 SP1 で発生します)