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

Warum kann C# keine generischen Typen in Methoden mit Einschränkungen ableiten?

Susan Sarandon
Freigeben: 2025-01-23 09:26:10
Original
446 Leute haben es durchsucht

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

Generischer C#-Typ-Inferenz: Seine Einschränkungen verstehen

Bei der Verwendung generischer C#-Methoden wird häufig davon ausgegangen, dass der Compiler die generischen Parameter basierend auf den Einschränkungen ableiten kann. Es gibt jedoch eine Situation, in der diese Schlussfolgerung schwierig zu erreichen scheint.

Bedenken Sie den folgenden Code:

<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();

        // 编译失败
        p.Process(query);

        // 需要显式指定泛型参数
        p.Process<SomeQuery, string>(query);
    }
}</code>
Nach dem Login kopieren

Dieser Code kann nicht kompiliert werden, da die generischen Parameter nicht abgeleitet werden können. Die Frage ist: Warum kann der Compiler nicht den richtigen Typ ableiten?

Laut dem ehemaligen Chefingenieur von Microsoft C#, Eric Lippert, liegt der Grund in der Art und Weise, wie C# die Typinferenz durchführt. Die Schlussfolgerung erfolgt einfach durch die Untersuchung der Parameter und der entsprechenden formalen Parametertypen. In diesem Fall fehlen dem Compiler ausreichende Informationen, um auf die generischen Parameter zu schließen.

-Einschränkungen, wie sie beispielsweise durch where TQuery : IQuery<TResult> definiert sind, gelten nicht als Teil der Signatur und können daher nicht direkt für Rückschlüsse verwendet werden.

Um dieses Problem zu lösen, müssen die generischen Parameter explizit angegeben werden, wie im zweiten ProcessMethodenaufruf gezeigt. Dies steht im Einklang mit der C#-Designphilosophie, dass Einschränkungen zusätzliche Informationen bereitstellen, aber die Signatur der Methode nicht ändern.

In der neuesten C#-Version wurden die Regeln zum Anwenden von Einschränkungen leicht geändert. Für genaueste Informationen wird empfohlen, die offizielle C#-Dokumentation zu konsultieren oder die tatsächliche Implementierung von C# 7.3 und höher zu überprüfen.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage