Heim >Backend-Entwicklung >C++ >Warum schlägt die generische C#-Typinferenz aufgrund von Schnittstelleneinschränkungen fehl?

Warum schlägt die generische C#-Typinferenz aufgrund von Schnittstelleneinschränkungen fehl?

DDD
DDDOriginal
2025-01-23 09:46:101058Durchsuche

Why Does C# Generic Type Inference Fail with Interface Constraints?

Einschränkungen der generischen C#-Typinferenz

Der Typinferenzmechanismus von C# kann normalerweise die generischen Parameter generischer Methoden intelligent ableiten. Allerdings kann die Typinferenz in einigen Fällen fehlschlagen, wie im folgenden Beispiel gezeigt:

<code class="language-csharp">interface IQuery<TResult> { }

interface IQueryProcessor
{
    TResult Process<TQuery, TResult>(TQuery query)
        where TQuery : IQuery<TResult>;
}

class SomeQuery : IQuery<string>
{ }</code>

Im obigen Code kann der Compiler beim Aufrufen der SomeQuery-Methode von IQueryProcessor mithilfe einer Process-Instanz nicht auf die korrekten generischen Parameter schließen. Die explizite Angabe der Parameter löst dieses Problem:

<code class="language-csharp">p.Process<SomeQuery, string>(query);</code>

Grund für fehlgeschlagene Inferenz

Entgegen anfänglichen Annahmen reichen Einschränkungen allein nicht für die Typinferenz aus. Die Typinferenz von C# basiert vollständig auf Parametern und ihren entsprechenden formalen Parametertypen. Da der bereitgestellte Parametertyp SomeQuery ist (der IQuery<string> implementiert), kann der Compiler nicht automatisch schließen, dass die generischen Parameter TQuery = SomeQuery und TResult = string sein sollten.

Eric Lippert im Artikel „Einschränkungen sind nicht Teil der Signatur“ (https://www.php.cn/link/4cf06252cc21d496e754ad7185d0617d.

Das obige ist der detaillierte Inhalt vonWarum schlägt die generische C#-Typinferenz aufgrund von Schnittstelleneinschränkungen fehl?. 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