8

そのような方法がある場合:

public void Foo<T1, T2>(T1 list)
    where T1 : IList<T2>
    where T2 : class
{
    // Do stuff
}

今私が持っている場合:

IList<string> stringList = new List<string>();
List<object> objectList = new List<object>();
IList<IEnumerable> enumerableList = new List<IEnumerable>();

次に、コンパイラは選択するジェネリックを解決できず、これは失敗します。

Foo(stringList);
Foo(objectList);
Foo(enumerableList);

また、使用するジェネリックを明示的に指定する必要があります。

Foo<IList<string>, string>(stringList);
Foo<IList<object>, object>(objectList);
Foo<List<object>, object>(objectList);
Foo<IList<IEnumerable>, IEnumerable>(enumerableList);
4

1 に答える 1

5

ジェネリック メソッド型の推論では、意図的に制約からの推論は行われません。代わりに、引数仮パラメーターから推定が行われ、推定された型引数が制約に対してチェックされます。

制約とメソッド シグネチャに関するいくつかの設計上の問題の詳細な議論については、既存の設計が賢明であると考えるのは間違っていると私に言う何十人もの人々を含めて、このテーマに関する私の記事を参照してください。

http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx

これは、同様の質問に対する Eric Lippert の回答の正確なコピーです。
この質問はより簡潔で明確なので、コピーすることにしました。

于 2013-02-22T07:36:32.467 に答える