ネストされたジェネリックを使用する場合、コンパイラは直接使用すると失敗しますが、制約を使用すると正しくコンパイルされます。
例:
public static void Test1<V, E>(this Dictionary<V, E> dict)
where V : IVertex
where E : IEdge<V>
{}
public static void Test2(this Dictionary<IVertex, IEdge<IVertex>> dict){}
上記の 2 つの拡張メソッドは、表向きは同じシグネチャを持っていますが、次のようなコードを実行しようとすると、次のようになります。
var dict = new Dictionary<VertexInstance, EdgeInstance>();
dict.Test1();
dict.Test2();
コンパイラは、'Test2' で、インラインでネストされたジェネリックを使用してジェネリック形式に変換できないことを示すエラーを出します。個人的には、の構文のTest2
方が直感的だと思います。
これはもともと、一般的な制約を使用することとインターフェイスを直接使用することの違いについて尋ねた質問の回答として投稿しましたが、なぜこれが起こるのか興味がありますか?