6

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 で発生します)

4

1 に答える 1

8

プログラムの別の部分 (おそらく別のプロジェクト) に以下があるかどうかは、コンパイル時に明確ではありません。

class SomeOtherClass : SomeClass, ISomeInterface
{
   public static IEnumerable<SomeClass> GetSomeStuff()
   {
      for( int i = 0; i<10; ++i)
         yield return new SomeOtherClass(i);
   }
}

これで、ランタイム チェックが成功しました。

SomeClassとしてマークするとsealed、これは不可能であり、キャストが機能しないことをコンパイル時に知ることができます。

于 2010-08-02T15:46:32.700 に答える