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.