Einschränkungen der generischen C#-Typinferenz: Der Fall von Schnittstellenbeschränkungen
Die generischen Methoden von C# ermöglichen eine anpassbare Datenverarbeitung für verschiedene Typen. Allerdings ist die automatische Typinferenz des Compilers nicht immer erfolgreich. Diese Einschränkung wird deutlich, wenn man sich mit Schnittstelleneinschränkungen in generischen Methoden befasst.
Betrachten Sie dieses Beispiel:
<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(); // Compilation Error: Type inference failed p.Process(query); // Explicit type arguments required for successful compilation p.Process<SomeQuery, string>(query); } }</code>
Der Compiler kann TQuery
und TResult
im ersten p.Process(query)
-Aufruf nicht ableiten. Der Grund dafür ist, dass der Typinferenzmechanismus von C# auf den Typen der bereitgestellten Argumente basiert. Obwohl query
vom Typ SomeQuery
ist, definiert dies allein TQuery
und TResult
nicht vollständig.
Die Einschränkung where TQuery : IQuery<TResult>
ermöglicht mehrere IQuery
Implementierungen, aber der Compiler kann die genaue Implementierung nicht aus dem Argumenttyp ableiten. Daher sind explizite Typargumente (<SomeQuery, string>
) erforderlich, um die generischen Typen aufzulösen.
Wie Eric Lippert erklärt (https://www.php.cn/link/4a3cffe005397d4cffdee044f1c8d30e), sind Einschränkungen nicht Teil der Signatur einer Methode und werden daher nicht für den Typ verwendet Schlussfolgerung. Die Inferenz basiert ausschließlich auf den formalen Parametertypen, die vor allem Einschränkungen ausschließen.
Das obige ist der detaillierte Inhalt vonWarum kann C# keine generischen Typargumente in Methoden mit Schnittstelleneinschränkungen ableiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!