Heim >Backend-Entwicklung >C++ >Warum kann C# keine generischen Typargumente in Methoden mit Schnittstelleneinschränkungen ableiten?

Warum kann C# keine generischen Typargumente in Methoden mit Schnittstelleneinschränkungen ableiten?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-23 09:31:09205Durchsuche

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

Einschränkungen der generischen C#-Typinferenz: Der Fall von Schnittstellenbeschränkungen

Die generischen Methoden von C# ermöglichen eine anpassbare Datenverarbeitung für verschiedene Typen. Allerdings ist die automatische Typinferenz des Compilers nicht immer erfolgreich. Diese Einschränkung wird deutlich, wenn man sich mit Schnittstelleneinschränkungen in generischen Methoden befasst.

Betrachten Sie dieses Beispiel:

<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>

Der Compiler kann TQuery und TResult im ersten p.Process(query)-Aufruf nicht ableiten. Der Grund dafür ist, dass der Typinferenzmechanismus von C# auf den Typen der bereitgestellten Argumente basiert. Obwohl query vom Typ SomeQuery ist, definiert dies allein TQuery und TResult nicht vollständig.

Die Einschränkung where TQuery : IQuery<TResult> ermöglicht mehrere IQuery Implementierungen, aber der Compiler kann die genaue Implementierung nicht aus dem Argumenttyp ableiten. Daher sind explizite Typargumente (<SomeQuery, string>) erforderlich, um die generischen Typen aufzulösen.

Wie Eric Lippert erklärt (https://www.php.cn/link/4a3cffe005397d4cffdee044f1c8d30e), sind Einschränkungen nicht Teil der Signatur einer Methode und werden daher nicht für den Typ verwendet Schlussfolgerung. Die Inferenz basiert ausschließlich auf den formalen Parametertypen, die vor allem Einschränkungen ausschließen.

Das obige ist der detaillierte Inhalt vonWarum kann C# keine generischen Typargumente in Methoden mit Schnittstelleneinschränkungen ableiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn