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>
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 Process
Methodenaufruf 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!