時折、私は実証し、簡単にジョンスキートとエリックリペットの同類によって回答されているスタックオーバーフロー上のエッジケースや他のすごみについての質問を参照して、言語とその多くの複雑さの深い知識を この1のように:
foreach
ループを使用するには、繰り返し処理するコレクションがIEnumerable
またはを実装する必要があると考えるかもしれませんIEnumerable<T>
。しかし、結局のところ、それは実際には要件ではありません。必要なのは、コレクションの型が、パブリックメソッドが呼び出されていなければならないということでGetEnumerator
、それが呼ばれるパブリックプロパティのゲッター持ついくつかのタイプを返す必要がありCurrent
、パブリックメソッドMoveNext
を返しますbool
。コンパイラがこれらの要件をすべて満たしていると判断できる場合、これらのメソッドを使用するためのコードが生成されます。それらの要件が満たされていない場合にのみ、オブジェクトがIEnumerable
またはを実装しているかどうかを確認しますIEnumerable<T>
。
それは知っておくべきクールなものです。エリックがこれを知っている理由を理解できます。彼はコンパイラチームに所属しているので、知っておく必要があります。しかし、インサイダーではないそのような深い知識を実証する人はどうでしょうか?
単なる人間(C#コンパイラチームに所属していない人)は、このようなことをどのようにして見つけるのでしょうか?
具体的には、これらの人々が体系的にそのような知識を根絶し、それを探求し、それを内面化するために使用する方法がありますか?