2010-12-10 13 views
6

Ich wollte nur wissen, warum versiegelte Klassen keine generischen Einschränkungen sein dürfen?Warum versiegelte Klassen dürfen keine generischen Einschränkungen sein?

Nehmen wir an, ich eine einfache Code-Snippet in C# haben als Gebrüll

public sealed class Base 
{ 
    public Base() { } 
} 

public class Derived<T> 
     where T : Base 
{ 
    public Derived() { } 
} 

Wenn ich die DerivedClass bin instanziieren ich bin immer ‚Base‘ ist keine gültige Einschränkung. Ein Typ, der als Einschränkung verwendet wird, muss eine Schnittstelle, eine nicht versiegelte Klasse oder ein Typparameter sein.

Antwort

10

Weil es dann keinen Sinn hat, generisch zu sein. T könnte nurBase sein, also könnten Sie auch einen nicht-generischen Typ machen, um damit zu beginnen.

Warum möchten Sie wollenDerived hier generisch sein? Warum würden Sie wollen eine Art namens Base (impliziert, dass es ein Basistyp sein sollte) versiegelt werden?

+0

Meine Vermutung ist, dass er Code generiert. Es ist nicht so, dass der Code-Generator weiß, dass jemand an der Klasse "versiegelt" ist. – Gabe

+5

Und natürlich durch ähnliche Logik können Sie "Objekt" nicht als Einschränkung verwenden, aus dem entgegengesetzten Grund; T wird bereits in Objekt konvertiert werden können, da nur Typen, die in Objekt konvertiert werden können, als Typargumente verwendet werden können, sodass die Einschränkung redundant wäre. –

+0

@EricLippert Auch wenn es keinen funktionalen Nutzen hat. Es hat einen Wartungsvorteil, da Sie viel einfacher einen generischen Constraint-Typ auslagern können, als alle Instanzen der versiegelten Klasse innerhalb eines neuen Typs zu ersetzen. Wenn auch ein kleiner Vorteil, sehe ich nicht, warum man einen nicht versiegelten generischen Typ durchsetzen würde. – Measuring

2

Weil T nie Kinderklassen haben wird! Es hat keinen Sinn, solche Generika zu haben.

+0

Eigentlich könnte T Kind Klassen haben, wenn es später entsiegelt wurde. Wenn das passieren würde, würde der existierende Code weiterhin wie geschrieben funktionieren, also ist diese Situation kein Problem. – Brian

0

T kann nichts anderes als Base sein. Also, was ist der Punkt, der es generisch macht?

1

Der Compiler möchte nicht die Mühe machen, etwas Generisches zu machen, wenn es nur eine Klasse gibt, die es jemals sein kann. Beachten Sie, dass eine versiegelte Klasse als generische Einschränkung verwendet werden kann, wenn die versiegelte Klasse als Typparameter übergeben wird. Zum Beispiel hat, wenn man eine Klasse

 
Class Foo(Of T, U As T) 

man eine Instanz der Klasse, wo sowohl generische Typparameter sind die gleiche eingeschlossene, da man auch Instanzen erstellen kann erstellen könnte, wo die Typparameter auf verschiedene Arten beziehen.

Verwandte Themen