C# ジェネリック型推論の制限: インターフェイス制約の場合
C# の汎用メソッドは、さまざまな型にわたって適応可能なデータ処理を提供します。 ただし、コンパイラーの自動型推論は常に成功するとは限りません。 この制限は、ジェネリック メソッドでインターフェイスの制約を扱うときに明らかになります。
次の例を考えてみましょう:
<code class="language-csharp">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { } class Test { void Test(IQueryProcessor p) { var query = new SomeQuery(); // Compilation Error: Type inference failed p.Process(query); // Explicit type arguments required for successful compilation p.Process<SomeQuery, string>(query); } }</code>
コンパイラーは、最初の TQuery
呼び出しで TResult
と p.Process(query)
の推論に失敗します。 その理由は、C# の型推論メカニズムが、指定された引数の types に依存しているためです。 query
は SomeQuery
型ですが、これだけでは TQuery
と TResult
を完全には定義できません。
制約 where TQuery : IQuery<TResult>
は複数の IQuery
実装を許可しますが、コンパイラーは引数の型から正確な実装を推測できません。 したがって、ジェネリック型を解決するには、明示的な型引数 (<SomeQuery, string>
) が必要です。
Eric Lippert が説明しているように (https://www.php.cn/link/4a3cffe005397d4cffdee044f1c8d30e)、制約はメソッドのシグネチャの一部ではないため、型には使用されません。推論。 推論は形式的なパラメーターの型のみに基づいており、重要なことに、制約は除外されます。
以上がC# がインターフェイス制約のあるメソッドのジェネリック型引数を推論できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。