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!