99 Stimmen

Gibt es einen vernünftigen Ansatz für "standardmäßige" Typparameter in C# Generics?

In C++ Templates kann man angeben, dass ein bestimmter Typparameter Standard ist. D.h. es wird standardmäßig Typ T verwendet, sofern nicht explizit angegeben.

Kann dies in C# durchgeführt oder angenähert werden?

Ich suche nach etwas wie:

public class MyTemplate {}

So dass eine Instanz des Typs, die T2 nicht explizit spezifiziert:

MyTemplate t = new MyTemplate();

Im Grunde genommen wäre es:

MyTemplate t = new MyTemplate();

Letztendlich bin ich auf der Suche nach einem Fall, bei dem ein Template recht weit verbreitet ist, aber ich erwäge, um einen zusätzlichen Typparameter zu erweitern. Ich könnte eine Unterklasse erstellen, nehme ich an, aber ich war neugierig, ob es in dieser Art noch andere Optionen gibt.

83voto

Reed Copsey Punkte 536986

Die Vererbung ist die beste Option.

Ich würde Ihre Hauptgenerische Klasse ableiten:

Klasse BaseGeneric

mit einer spezifischen Klasse

Klasse MyGeneric : BaseGeneric

Dadurch ist es einfach, Ihre Logik an einem Ort zu behalten (der Basisklasse), aber auch einfach, beide Verwendungsmöglichkeiten bereitzustellen. Je nach Klasse ist wahrscheinlich sehr wenig zusätzliche Arbeit erforderlich, um dies zu erreichen.

22voto

Thanasis Ioannidis Punkte 2569

Eine Lösung ist die Vererbung. Eine andere, die ich stattdessen verwenden würde, sind Factory-Methoden (kombiniert mit dem var-Schlüsselwort).

public class MyTemplate
{
     public MyTemplate(..args..) { ... } // Konstruktor
}

public static class MyTemplate{

     public static MyTemplate Create(..args..)
     {
         return new MyTemplate(... params ...);
     }

     public static MyTemplate Create(...args...)
     {
         return new MyTemplate(... params ...);
     }
}

var val1 = MyTemplate.Create();
var val2 = MyTemplate.Create();

In obigem Beispiel ist val2 vom Typ MyTemplate und nicht ein davon abgeleiteter Typ.

Ein Typ class MyStringTemplate:MyTemplate ist nicht der gleiche Typ wie MyTemplate. Dies könnte in bestimmten Szenarien Probleme verursachen. Beispielsweise können Sie eine Instanz von MyTemplate nicht in MyStringTemplate umwandeln.

15voto

Nerdroid Punkte 12281

Sie können auch eine Klasse Überlastung wie folgt erstellen

public class MyTemplate {
    public T1 Prop1 { get; set; }
    public T2 Prop2 { get; set; }
}

public class MyTemplate : MyTemplate{}

10voto

mmx Punkte 400975

C# unterstützt ein solches Feature nicht.

Wie du gesagt hast, kannst du es untergeordnet machen (wenn es nicht versiegelt ist, und alle Konstruktordeklarationen duplizieren), aber es ist eine ganz andere Sache.

3voto

Andrew Hare Punkte 332190

Leider unterstützt C# nicht, was Sie versuchen zu tun. Es wäre eine schwierige Funktion zu implementieren, da der Standardtyp für einen Parameter den generischen Einschränkungen entsprechen müsste und wahrscheinlich Kopfschmerzen verursachen würde, wenn die CLR versucht, die Typensicherheit sicherzustellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X