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

Warum kann C# keine generischen Typen mit Schnittstelleneinschränkungen ableiten?

Barbara Streisand
Barbara StreisandOriginal
2025-01-23 09:41:08301Durchsuche

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

Einschränkungen der generischen C#-Typinferenz

Warum kann C# in diesem Fall nicht auf den generischen Typ schließen?

Bei der Verwendung generischer Methoden identifiziert die C#-Typinferenz normalerweise die richtigen generischen Parameter. In einigen Fällen kann es jedoch fehlschlagen, sodass der Programmierer den Typ explizit angeben muss. In diesem Artikel wird eine Situation besprochen, in der ein Compiler angeblich nicht in der Lage ist, Schlussfolgerungen zu ziehen.

Bedenken Sie den folgenden Codeausschnitt:

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

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

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

Wenn in einer Test-Methode SomeQuery mit einer Process-Instanz als Argument aufgerufen wird, kann der Compiler nicht auf das generische Argument

schließen
<code class="language-c#">class Test
{
    void Test(IQueryProcessor p)
    {
        var query = new SomeQuery();

        // 无法编译 :-(
        p.Process(query);

        // 必须显式编写所有参数
        p.Process<SomeQuery, string>(query);
    }
}</code>

Die Frage ist, warum der Compiler in diesem Fall die generischen Parameter nicht erfolgreich ableitet?

Einschränkungen und Schlussfolgerungen

Die Antwort liegt darin, wie C# mit generischen Parameterbeschränkungen umgeht. Einschränkungen (z. B. TQuery : IQuery<TResult>) schränken die Typen ein, die als Argumente verwendet werden können. Einschränkungen gelten jedoch nicht als Teil der Methodensignatur und können daher nicht für die Typinferenz verwendet werden.

In diesem speziellen Fall kann der Compiler feststellen, dass der query-Parameter IQuery<TResult> implementiert, aber er kann die Einschränkungen nicht verwenden, um auf den konkreten Typ von TResult zu schließen. Daher sind explizite Typparameter erforderlich.

Fazit

Bei der Verwendung von Generika ist es wichtig, die Einschränkungen der C#-Typinferenz zu verstehen. Während der Compiler normalerweise ziemlich gute Arbeit beim Ableiten von Typen leistet, wird dies in einigen Fällen durch Einschränkungen verhindert. In diesem Fall müssen spezifische generische Parameter bereitgestellt werden, um den Compiler zu steuern.

Das obige ist der detaillierte Inhalt vonWarum kann C# keine generischen Typen 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