ホームページ > バックエンド開発 > C++ > C# がインターフェイス制約のあるメソッドのジェネリック型引数を推論できないのはなぜですか?

C# がインターフェイス制約のあるメソッドのジェネリック型引数を推論できないのはなぜですか?

Patricia Arquette
リリース: 2025-01-23 09:31:09
オリジナル
209 人が閲覧しました

Why Can't C# Infer Generic Type Arguments in Methods with Interface Constraints?

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 呼び出しで TResultp.Process(query) の推論に失敗します。 その理由は、C# の型推論メカニズムが、指定された引数の types に依存しているためです。 querySomeQuery 型ですが、これだけでは TQueryTResult を完全には定義できません。

制約 where TQuery : IQuery<TResult> は複数の IQuery 実装を許可しますが、コンパイラーは引数の型から正確な実装を推測できません。 したがって、ジェネリック型を解決するには、明示的な型引数 (<SomeQuery, string>) が必要です。

Eric Lippert が説明しているように (https://www.php.cn/link/4a3cffe005397d4cffdee044f1c8d30e)、制約はメソッドのシグネチャの一部ではないため、型には使用されません。推論。 推論は形式的なパラメーターの型のみに基づいており、重要なことに、制約は除外されます。

以上がC# がインターフェイス制約のあるメソッドのジェネリック型引数を推論できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート