Warum ist das in C # Generics nicht möglich?

7

Ein Kollege wies mich auf einen seltsamen Fall in C # hin (nicht so sicher, ob das wirklich seltsam ist).
Angenommen, Sie haben eine Klasse Mitarbeiter. Wenn Sie eine generische Liste erstellen möchten & lt; & gt; vom Typ Mitarbeiter, können Sie einfach tun:

%Vor%

Ich verstehe, dass ich den Typ Employee an die Liste Generic übergeben muss, damit er die erforderlichen Typinformationen über Employee kennt und Methoden generiert, die Parameter zurückgeben und akzeptieren, die mit Employee kompatibel sind.

Nun meine Frage ist, warum ist es nicht möglich, folgendes zu tun?

%Vor%

Sollte dies nicht ausreichen, müssen die für List & lt; & gt; zu wissen, um eine Liste zu erstellen? Mit anderen Worten, der Typ von x, der der Typ von Employee ist, wird nun als generischer Typparameter an List & lt; & gt; übergeben, was (wie ich früher glaubte) der Übergabe des Typnamens (in diesem Fall Employee) entspricht ).

Ich weiß, dass so etwas in Java verfügbar ist (mit .class ) Schlüsselwort für eine Variable.

Ich bin mir sicher, dass ich etwas verpasse, also bitte, erleuchte mich Jungs!

    
Galilyou 03.02.2010, 15:04
quelle

6 Antworten

30

Nein, das Äquivalent zu ist nicht in Java verfügbar. Sie können "x.class" nicht verwenden, um den deklarierten Typ einer Variablen zu erhalten.

Außerdem funktioniert typeof(x) in C # nicht, um den Typ einer Variablen zu erhalten - sie gibt eine Type -Referenz für den -Typ -Namen zurück, z. typeof(string) gibt einen Verweis auf das Objekt Type zurück, das dem Typ System.String zugeordnet ist. Das entspricht der Verwendung von String.class in Java. (Beachten Sie, dass auch .class auf einen Typnamen angewendet wird, nicht ein Variablenname.)

Java-Generics unterstützen auch nichts wie Ihre abschließende Aussage. Wenn Sie glauben, dass sie es tun, geben Sie bitte ein Beispiel:)

Was Sie in C # tun können, ist die Verwendung der Typinferenz, um das zu tun, was Sie wollen:

%Vor%

Beachten Sie, dass es keinen Grund gibt, warum C # nicht erweitert werden kann, um etwas wie typeof(variablename) oder List<typeof(variablename)> zu erlauben - schließlich sind es alle Informationen zum Kompilierungszeitpunkt. Allerdings kann ich nicht sehen, dass es die Anforderungen des Teams für Nützlichkeit erfüllen würde ... es gibt andere, viel nützlichere Funktionen, die ich zuerst sehen möchte:)

    
Jon Skeet 03.02.2010, 15:06
quelle
2

Der Grund dafür ist, dass typeof () ein type-Objekt zurückgibt, während Sie einen Typnamen benötigen, um eine Liste zur Kompilierzeit zu initialisieren.

    
Håvard S 03.02.2010 15:07
quelle
2

Ein Teil der Antwort ist, dass der Typ von x zur Kompilierzeit nicht verfügbar ist, d. h. er könnte mit etwas wie diesem erstellt werden:

%Vor%

Sie können jedoch eine Liste einer Basisklasse erstellen, die Sie in der Liste speichern möchten (oder sogar eine Liste von "Objekten").

    
dbemerlin 03.02.2010 15:11
quelle
1

typeof wird mit Klassennamen verwendet. Benutze GetType() für ein Objekt, aber nur zur Laufzeit ...

    
Daren Thomas 03.02.2010 15:09
quelle
1

Was Ihnen fehlt - imho - ist der Unterschied zwischen einer statischen Typreferenz zur Kompilierungszeit und einer Dinamyc-Typreferenz (über eine Instanz von System.Type) zur Laufzeit.

typeof () und .GetType () geben Ihnen letzteres. (für Typen bzw. Instanzen)

Ich hoffe, es macht klar.

Jon Skeets Code oben ist cool.

    
Dercsár 03.02.2010 15:24
quelle
0

Ich kann seit C # 3.0 keinen Grund finden, eine leere Liste zu erstellen.

Ich erstelle Listeninstanzen im Allgemeinen nur mit einer ToList-Methode aus einem IEnumerable, der wiederum mithilfe einer Yield-Rückgabe, Concat (), Repeat (), Where () usw. generiert wird.

%Vor%

,

%Vor%     
George Polevoy 03.02.2010 16:02
quelle

Tags und Links