.NET でジェネリック メソッドの戻り値の型を推論できない理由
.NET では、ジェネリック メソッドの戻り値の型を推論できません。この制限は、式内で型推論が「双方向」に流れるのを防ぐために適用されます。これにより、可能な型の組み合わせが爆発的に増加する可能性があります。
例
次の汎用メソッド:
static TDest Gimme<TSource, TDest>(TSource source) { return default(TDest); }
戻り値の型推論が許可されている場合、次のコードは次のようになります。 valid:
string dest = Gimme(5);
ただし、Gimme の戻り値の型は引数の型 int から推測できないため、このコードはコンパイラ エラーになります。
Reasoning
この制限の背後にある理由は、型情報が式の内側と外側の両方から流れる状況を防ぐことです。次のシナリオを考えてみましょう。
シナリオ 1: 複数のオーバーロード
引数の型が異なるメソッド N の 10 個のオーバーロードがあるとします。ジェネリック メソッドの戻り値の型の推論を許可する場合、式 N(G(5)) 内の G の戻り値の型を推論する必要があります。これには、N の 10 個のオーバーロードをすべて考慮し、「最適な」ものを選択する必要があります。ただし、「最適な」オーバーロードを決定する基準が明確ではないため、曖昧さが生じる可能性があります。
シナリオ 2: 条件式
式 double x = b について考えてみましょう。 ? G(5) : 123. 戻り値の型の推論が許可されている場合は、条件式 (double) の型に基づいて G の戻り値の型を決定する必要があります。ただし、これでは、G の戻り値の型が条件式 (int) の引数の型に暗黙的に変換可能である必要がある可能性が考慮されていません。
シナリオ 3: ネストされた式
式 N(N(b ? G(5) * のように、複数の条件式とメソッド呼び出しを組み合わせると、 G("hello") : 123))、戻り値の型推論の複雑さは指数関数的に増加します。 G と N の考えられるすべてのオーバーロードを組み合わせて考慮する必要があり、考えられる型の組み合わせが爆発的に増加します。
結論
ジェネリックの戻り型推論を禁止することで.NET は、これらの組み合わせ爆発を防ぎ、型推論が予測可能かつ一貫した方法で行われるようにします。
以上が.NET がジェネリック メソッドの戻り値の型を推論できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。