Heim >Backend-Entwicklung >C++ >Warum kann C# keine generischen Typen mit Schnittstelleneinschränkungen ableiten?
Einschränkungen der generischen C#-Typinferenz
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
<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?
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.
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!