2010-09-16 6 views

Antwort

18

as Verwendung wird ordnungsgemäß fehlschlagen, wenn das Objekt der falsche Typ ist, und der resultierende Wert wird null, in dem ein normaler Guss eine InvalidCastException werfen würde:

object x = new object(); 
string y = x as string; // y == null 
string z = (string)x; // InvalidCastException 
1

as Gießen wird eine Ausnahme nerer zu werfen, während übliche Besetzung kann.

Object a = new Object(); 
String b = a as String; 
if(b != null) // always false for this example. 
{} 
1

Normale Typumwandlung kann das Rück IllegalTypeCast Ausnahme, wo als asnull in diesem Fall zurück.

1
((Class2) obj) // Throws exception when the casting cannot be made 

Class2 C = obj as Class2 // Will return NULL if the casting cannot be made 
0

as kann nicht mit Werttypen (Nicht-Nullable-Typen) verwendet werden.

Für Referenztypen ...

expression as type 

ist wirklich das gleiche wie

expression is type ? (type) expression : (type) null 

außer dass expression wird nur einmal ausgewertet.

In einer Anspielung auf Bill Clinton, von 'ist' in 'Ausdruck ist Typ', meine ich 'is'.

Grundsätzlich, wie die anderen Antworten anzeigen, bedeutet dies, dass die Rückgabe null ist, wenn der Cast fehlschlagen würde. Es wird jedoch auch null zurückgegeben, wenn die Umwandlung erfolgreich war, der Typ jedoch falsch ist.

ist hier ein etwas dummes Beispiel:

uint? u = 52; 
int? i = (int?) u; // 'i' is now 52 

aber

uint? u = 52; 
object d = u; 
int? i = d as int?; 

Was ist der Wert von i? 52? Nee. Es ist null.

Warum das Objekt drin? Es stellte sich heraus, dass ich oben gelogen habe, als ich "wie" in Bezug auf "ist" erklärt habe.

beachten:

uint? u = 52; 
int? i = (u is int?) ? (int?) u : (int?) null; 

'i' jetzt Oops null

uint? u = 52; 
int? i = u as int?; 

ist. Compilerfehler Also, ich denke, die beiden Aussagen sind nicht genau gleich.

+2

Kurz gesagt: is is is und so wie es auch ist. –

+0

Nicht nur das, aber ich muss C# schreiben, die '?' wie Lisp verwendet Klammern. :-) – Justin

7

Die Anwendungsfälle der beiden Operatoren sind oberflächlich ähnlich, aber semantisch recht unterschiedlich. Ein Cast teilt dem Leser mit: "Ich bin mir sicher, dass diese Konvertierung legal ist und ich bin bereit, eine Runtime-Ausnahme zu machen, wenn ich falsch liege". Der "as" -Operator teilt mit: "Ich weiß nicht, ob diese Konvertierung legal ist oder nicht; wir werden es versuchen und sehen, wie es läuft".

Weitere Informationen zu diesem Thema finden Sie in meinem Artikel über das Thema:

http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

+1

Es kann das kommunizieren, aber nicht unbedingt. Ich habe das 'as' Schlüsselwort verwendet, wenn ich sicher bin, dass eine Konvertierung funktioniert, weil ich es vorziehe:' (myobj als MyType) .SomeProperty 'over' ((MyType) myobj) .SomeProperty' In diesem Fall wird der So wie ich es gemacht habe, teilt es mir mit, dass ich bereit bin, eine 'NullReferenceException' zur Laufzeit zu nehmen, wenn dies nicht der Fall ist. Ich wollte nur darauf hinweisen, dass es eine stilistische Sache ist. – jasonh

+1

@jasonh - Die Verwendung von 'as' liest sich so stilistisch falsch zu mir. Es würde uns wundern, warum eine Besetzung nicht gemacht wurde. Eine ungültige Cast-Exception würde einen Entwickler schneller zum Problem führen als eine Null-Referenz-Exception. Ich bevorzuge Eric's Stil. –

0

Sie werden nie eine Umwandlung Ausnahme erhalten, wenn Sie „als“ Schlüsselwort. Das Ergebnis der Konvertierung ist null, wenn Sie eine ungültige Konvertierung versuchen.

Implizit/explizit konvertieren kann zwischen Klassen/Schnittstellen mit erben/implementieren Beziehungen verwendet werden, sonst wird es einen Kompilierungsfehler geben. Siehe Beispiel:

public class A {} 
public class B {} 
... 
A a = new A(); 
//B b = (B)a; //compile error:Cannot implicitly convert type 'A' to 'B' 

Eine andere Situation implizit/explizit konvertieren ist, gibt es keine Beziehung zwischen Klasse A und B, aber Sie schreiben einen implicit/explicit Betreiber selbst.

0

Auch, wie nur mit Referenztypen verwendet werden kann. Das ist eigentlich ziemlich logisch, denn wenn die Konvertierung fehlschlägt, gibt sie false zurück, und das ist kein möglicher Wert für einen Werttyp.

Also für Werttypen muss normale Typumwandlung verwendet werden.

Verwandte Themen