Heim >Backend-Entwicklung >C++ >Warum können C#-Konstruktoren keine Typinferenz von generischen Methoden erben?

Warum können C#-Konstruktoren keine Typinferenz von generischen Methoden erben?

DDD
DDDOriginal
2025-01-20 06:37:13600Durchsuche

Why Can't C# Constructors Inherit Type Inference from Generic Methods?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn