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

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?
