Warum können C#-Konstruktoren keine Typinferenz von generischen Methoden erben?
In C# fehlen Konstruktoren die Typinferenzfunktionen generischer Methoden. Zum Beispiel im folgenden Code:
<code class="language-csharp">public class MyType<T> { private readonly T field; public MyType(T value) { field = value; } } var obj = new MyType(42); // 期望类型:MyType<int></code>
Der Compiler kann nicht schließen, dass obj
vom Typ MyType<int>
ist. Eine Lösung besteht darin, eine Factory-Klasse zu verwenden:
<code class="language-csharp">public class MyTypeFactory { public static MyType<T> Create<T>(T value) { return new MyType<T>(value); } } var myObj = MyTypeFactory.Create(42);</code>
Dies wirft Fragen nach den Gründen für diese Einschränkung auf.
Gibt es eine Grundursache?
Es gibt keinen schlüssigen Grund, der Konstrukteure daran hindert, Typinferenzen durchzuführen. Im Gegensatz dazu erfordert die Identifizierung aller relevanten Typen und die Auflösung von Überladungen zwischen Konstruktoren mit unterschiedlicher Anzahl von Parametern einen komplexen Algorithmus. Um die Abwärtskompatibilität sicherzustellen, haben außerdem nicht-generische Konstruktoren Vorrang vor abgeleiteten Konstruktoren.
Praktische Hindernisse: Vor- und Nachteile abwägen
Obwohl die Typinferenz in Konstruktoren einen Nettovorteil hat, garantiert dies nicht unbedingt ihre Implementierung. Die Realisierbarkeit einer Funktion hängt von ihrem relativen Wert im Verhältnis zu anderen potenziellen Verbesserungen, der Ressourcenzuweisung und Kompatibilitätsproblemen ab.
Fabrikmuster: Eine clevere Alternative
Das Factory-Methodenmuster bietet eine wirksame Lösung für das Fehlen einer Konstruktortyp-Inferenz. Durch die Einführung einer zusätzlichen Abstraktionsebene kann Typinferenz auf Factory-Methoden angewendet werden, um ähnliche Ergebnisse zu erzielen, ohne den Konstruktor selbst zu ändern.
Änderungen, die nie umgesetzt wurden
Obwohl die Implementierung für C# 6 in Betracht gezogen wurde, wurde diese vorgeschlagene Funktion letztendlich aus dem endgültigen Design entfernt. Die Tatsache, dass es kurz vor der Einführung stand, verdeutlichte seinen potenziellen Nutzen, doch letztlich hatten andere Prioritäten Vorrang.
Das obige ist der detaillierte Inhalt vonWarum können C#-Konstruktoren keine Typinferenz von generischen Methoden erben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!