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

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

Barbara Streisand
Barbara Streisandオリジナル
2025-01-23 09:41:08357ブラウズ

Why Can't C# Infer Generic Types with Interface Constraints?

C# ジェネリック型推論の制限

この場合、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。