C#は主にstronglt型ですが、いくつかの奇妙な動作があります。
たとえば、独自の列挙子クラスをロールする場合、IEnumerableを実装する必要はなく、GetEnuerator()と呼ばれるメソッドを実装するだけで済み、それをforeach
上書きすることはできます。
一部のLinqサポートについても同じことが言えます。いくつかのselect
where
メソッドなどを提供するだけで、独自のLinqプロバイダーを作成できます。
では、なぜusing(x){}
ステートメントにIDisposableが必要なのですか?
フルフィルするための固定契約はなく、メソッドの一種のパターンしかないので、なぜlinqプロバイダーをそのように書くことができるのかわかります。
C#コンパイラ(または言語仕様)が、組み込みの言語構造の一部にはインターフェイスが必要であるが、他の構造には必要ないように設計されているのはなぜですか?