zenten - Fr 13.08.10 17:07
Titel: is Operator
Hallo..
Mein Beispiel:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| class a {} class b : a {}
b obj = new b();
if (obj is a) { a test = (a) obj; } |
Muss ich hier das explizite Casting "
(a)" verwenden, oder kann ich das weglassen???, weil
der Typ dann ja eigentlich bekannt ist und die implizite konvertierung keinen Fehler verursacht, mich hatten nur einige Beispiele verwirrt, bei denen das so gemacht wurde!
Gruß
zenten
gfoidl - Fr 13.08.10 18:07
Hallo,
der Cast ist hier nicht nötig da "b" von "a" erbt. D.h. automatisch "b" ist auch "a".
Bei
C#-Quelltext
1: 2: 3: 4: 5: 6:
| class a {} class b : a {}
a obj = new b(); b test1 = (b)obj; b test2 = obj as b; |
ist der Cast jedoch notwendig.
mfG Gü
Kha - Fr 13.08.10 19:09
zenten hat folgendes geschrieben : |
| der Typ dann ja eigentlich bekannt ist |
Um ein wenig auf die Theorie einzugehen: Der Compiler
könnte innerhalb eines "
if (x is T)" x auf T einschränken, aber das dürfte ein ziemlich kompliziertes formales Typsystem erzeugen. Und was soll passieren, wenn T ein Interface ist? Kann ich dann auf die Schnittmenge der Member beider Typen zugreifen?
Übrigens wird statt
C#-Quelltext
1: 2: 3:
| if (x is T) { var x1 = (T)x; ... |
gewöhnlicherweise eine andere Schreibweise benutzt:
C#-Quelltext
1: 2: 3:
| var x1 = x as T; if (x1 != null) ... |
Einen echten Vorteil sehe ich daran aber eigentlich nicht. Darauf, dass der erste Code einen Cast mehr erzeugt, würde ich mich beim .NET-JIT wirklich nicht verlassen. Zwar muss man dort den Typ zweimal ausschreiben, dafür erzeugt der untere Code die Variable
außerhalb des Scopes des if-Blocks, auch nicht sehr schön.