2 Stimmen

Generischer Typ-Parameter in .net(C#), dessen Wert einer der angegebenen Typen sein kann?

Sagen wir, ich habe Unterricht ClassA , ClassB , ClassC . Sie alle erben von object und keine von ihnen implementiert eine Schnittstelle.

Ist es in C# möglich, eine generische Schnittstelle zu deklarieren, die ein generisches Argument T und dass T kann entweder ClassA o ClassB o ClassC ?

Ich würde also etwas haben wie

public interface MyInterface<T> where T: ClassA | ClassB | ClassC {
    ...
}

Wenn dies möglich ist, wie lautet die Syntax?


Ich weiß, dass ich diese Klassen haben könnte. ClassA , ClassB , ClassC eine Schnittstelle zu implementieren und sie dann als Randbedingung von T aber bevor ich eine Schnittstelle erstelle, die keine Methoden hat, möchte ich wissen, dass es keinen besseren Weg gibt.

6voto

Lasse V. Karlsen Punkte 364542

Es gibt keinen besseren Weg.

Sie können nur angeben eine Basisklasse oder Schnittstelle als diese Einschränkung.

Aber lassen Sie mich fragen: Warum beschränken Sie sich auf diese 3 Klassen, wenn sie nichts gemeinsam haben? Da Sie sagen, Sie könnten sich auf eine Schnittstelle beschränken ohne Methoden Was verwenden Sie eigentlich von diesen Klassen?

Mit einer Schnittstellenbeschränkung kann die nur Sie wissen nur, dass das verwendete Objekt diese Schnittstelle implementiert.

3voto

Daniel Hilgarth Punkte 165768

Das ist nicht möglich, da ein Typ die folgenden Bedingungen erfüllen muss alle die Zwänge, nicht nur einen.
Wie auch immer, wenn Ihre Schnittstelle keine einzige Methode enthält, bedeutet das, dass Ihre Klassen keine Gemeinsamkeiten haben. Wie würden Sie sie also überhaupt in Ihrer generischen Methode verwenden?
Ich glaube, Sie übersehen etwas Wichtiges oder haben uns nicht die ganze Geschichte erzählt.

2voto

mavnn Punkte 8433

Keine Antwort, es sei denn, Sie möchten die Programmiersprache wechseln, aber F# erlaubt wesentlich mehr Kontrolle als C# über die Spezifikation von Generika durch die Verwendung von Zwänge bis hin zum "Explicit Member Constraint", der im Grunde eine statische Enten-Typisierung darstellt.

Sie ermöglicht außerdem Benachteiligte Gewerkschaften die Ihr Problem auf eine andere Weise lösen würde.

Alles, um zu sagen, dass die .net-Laufzeitumgebung diese Art von Dingen unterstützt, aber es gibt keine einfache Syntax für sie in C#.

1voto

Robert Giesecke Punkte 4256

Nein, das können Sie nicht. Die generischen Beschränkungen sind im Moment ziemlich begrenzt.

Sie erlauben nichts außer einer Typenhierarchie, dass T ein Referenztyp ist oder dass T einen öffentlichen parameterlosen ctor hat.

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