C # /. NET: Ist 'typeof (variable)' ein mögliches Sprachmerkmal?

9

Ich habe mehrmals versucht, den deklarierten Typ relativ weit von seiner Deklaration aus einer Variablen zu entlocken, um herauszufinden, dass typeof(T) nur bei Typnamen funktioniert.

Ich habe mich gefragt, ob es irgendwelche brechenden Änderungen geben würde, um auch typeof(variable) zu erlauben.

Zum Beispiel mit diesem Code:

%Vor%

Sie erhalten etwas wie:

  

Ziege
  Tierisches   Ziege
  Ziege

Warum ist das nicht möglich?

%Vor%
  

Ziege
  Tier

Ich habe der Spezifikation einen flüchtigen Blick gegeben und kann keinen Konflikt finden. Ich denke, dass es die Frage "Warum dieser Typ?" wenn Sie den Operator typeof verwenden.

Ich weiß, dass der Compiler hier ist. Eine Implementierung mit Erweiterungsmethoden ist eigentlich trivial:

%Vor%

Aber das fühlt sich schmutzig an und missbraucht die Typ-Inferenz des Compilers.

    
John Gietzen 08.11.2010, 15:39
quelle

5 Antworten

3

Angenommen, es ist erlaubt:

%Vor%     
jason 08.11.2010, 15:43
quelle
4

Ich denke, das Problem ist, dass .GetType () älter als typeof () ist. Früher gab es einen Tag in C #, wo Sie

machen mussten %Vor%

, um den String-Typ zu erhalten (zum Beispiel), bis typeof () geboren wurde. Ich denke, wenn das Konzept Teil des ursprünglichen Sprachdesigns gewesen wäre, könnte es tatsächlich so funktionieren, wie Sie es beschreiben. Da typeof () eine späte Einführung in die Sprache war, mussten die Designer eine Wahl treffen: Obsolet / deprecate / remove .GetType () (und dabei viele, viele Verwendungen davon überflüssig machen), make typeof () Überlappen Sie die Funktionalität mit GetType () (was Sie fragen), oder machen Sie die Verwendung von typeof () nicht mit GetType () überlappen. Ich denke, die C # Leute haben sich einfach dafür entschieden, die Funktionalität nicht zu überlappen (um die Dinge einfach und klar zu halten), und so war typeof () so eingeschränkt, wie es heute ist.

    
Gabriel Magana 08.11.2010 15:52
quelle
0

Wenn Sie nur versuchen, den Typ von etwas zu bekommen, können Sie einfach

anrufen %Vor%

sollte es dem gewünschten Verhalten geben.

    
Daniel DeSousa 08.11.2010 15:45
quelle
0

Sie scheinen hier zwei verschiedene Fragen zu stellen, die erste ist, warum gibt es keinen Operator, um den deklarierten Variablentyp zu finden, und der andere fragt, warum typeof (o) nicht das Äquivalent sein kann von o.GetType () .

Der erste Grund liegt darin, dass es keinen Zweck erfüllt, der deklarierte Typ einer Variablen ist per Definition immer zur Kompilierzeit bekannt. Hinzufügen eines Operators dafür würde keinen Wert hinzufügen.

Zum anderen besteht das Problem darin, dass die Verwendung von typeof (instance) Probleme mit der Auflösung verursacht. Wie Jason oben erwähnt, bedenken Sie:

%Vor%

Was ist t? Wenn Sie t als typeof (string) behandeln, fügen Sie der Sprache nur massive Änderungen hinzu. Stellen Sie sich vor, der gesamte Code, der derzeit annimmt, dass t ein Tier ist, das derzeit korrekt ist.

Wenn Sie t jedoch als typeof (Animal) behandeln, ist Ihr Code unglaublich spröde. Stellen Sie sich die Situation vor, in der es keine Tierklasse gab, als Sie den Code geschrieben haben, aber ein Jahr später hat jemand in einem von Ihnen importierten Namespace eine Animal-Klasse hinzugefügt. Ihr Code würde brechen, weil die Auflösungsregeln jetzt den Animal-Typ und nicht die lokale Variable verwenden würden.

    
tnyfst 08.11.2010 16:08
quelle
-4

Wenn ich das machen möchte, verwende ich Convert.ChangeType()

Ссылка

    
Jean Fabre 13.05.2015 11:12
quelle

Tags und Links