C# ジェネリック型推論の制限
ジェネリック メソッドを使用すると、通常、C# の型推論によって正しいジェネリック パラメーターが識別されます。ただし、場合によっては失敗し、プログラマが型を明示的に指定する必要が生じることがあります。この記事では、コンパイラーが推論を行うのに欠陥があると言われる状況について説明します。
次のコード スニペットを考えてみましょう:
<code class="language-c#">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { }</code>
Test
メソッドで、引数として SomeQuery
インスタンスを指定して Process
を呼び出すと、コンパイラーはジェネリック引数を推論できません:
<code class="language-c#">class Test { void Test(IQueryProcessor p) { var query = new SomeQuery(); // 无法编译 :-( p.Process(query); // 必须显式编写所有参数 p.Process<SomeQuery, string>(query); } }</code>
問題は、この場合、なぜコンパイラーがジェネリックパラメーターを正常に推論しないのかということです。
答えは、C# が一般的なパラメーター制約をどのように処理するかにあります。制約 (TQuery : IQuery<TResult>
など) は、引数として使用できる型を制限します。ただし、制約はメソッド シグネチャの一部とみなされないため、型推論には使用できません。
この特定のケースでは、コンパイラーは query
パラメーターが IQuery<TResult>
を実装していると判断できますが、制約を使用して TResult
の具体的な型を推論することはできません。したがって、明示的な型パラメータが必要です。
ジェネリックを使用する場合、C# の型推論の制限を理解することが重要です。コンパイラは通常、型の推論を非常に適切に実行しますが、場合によっては、制約によって推論が妨げられることがあります。この場合、コンパイラーをガイドするために特定の汎用パラメーターを提供する必要があります。
以上がC# がインターフェイス制約のあるジェネリック型を推論できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。