Autor Beitrag
zenten
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 13.08.10 17:07 
Hallo..

Mein Beispiel:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: 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
ausblenden 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ü

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 13.08.10 19:09 
user profile iconzenten hat folgendes geschrieben Zum zitierten Posting springen:
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
ausblenden C#-Quelltext
1:
2:
3:
if (x is T) {
  var x1 = (T)x;
  ...

gewöhnlicherweise eine andere Schreibweise benutzt:
ausblenden 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.

_________________
>λ=


Zuletzt bearbeitet von Kha am Sa 14.08.10 12:27, insgesamt 1-mal bearbeitet
zenten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Sa 14.08.10 10:33 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

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.


Dazu habe ich noch folgendes gefunden:
blogs.escde.net/joch...e/2007/04/02/71.aspx

Gruß
Zenten