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(); // 编译失败 p.Process(query); // 需要显式指定泛型参数 p.Process<SomeQuery, string>(query); } }</code>
汎用パラメーターを推論できないため、このコードはコンパイルに失敗します。問題は、なぜコンパイラが正しい型を推定できないのかということです。
元 Microsoft C# チーフ エンジニア Eric Lippert 氏によると、その理由は C# が型推論を実行する方法にあります。推論は、パラメータと対応する仮パラメータの型を調べるだけで行われます。この場合、コンパイラには汎用パラメータを推測するための十分な情報が不足しています。
によって定義された制約などの where TQuery : IQuery<TResult>
制約は、署名の一部とみなされないため、推論に直接使用することはできません。
この問題を解決するには、2 番目の Process
メソッド呼び出しに示すように、ジェネリック パラメーターを明示的に指定する必要があります。これは、制約によって追加情報が提供されるが、メソッドのシグネチャは変更されないという C# の設計哲学と一致しています。
最新の C# バージョンでは、制約を適用するためのルールが若干変更されました。最も正確な情報については、C# の公式ドキュメントを参照するか、C# 7.3 以降の実際の実装を確認することをお勧めします。
以上がC# が制約のあるメソッドでジェネリック型を推論できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。