2010-09-16 9 views

risposta

18

Utilizzando as fallirà con grazia se l'oggetto è il tipo sbagliato, e il valore risultante sarà nullo, in cui un cast normale avrebbe gettato un InvalidCastException:

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

as fusione sarà nerer un'eccezione, mentre solita scelta di cast.

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

cast di tipo normale può restituire un'eccezione IllegalTypeCast dove come as tornerà null in quel caso.

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 non può essere utilizzato con tipi valore (tipi non annullabili).

Per i tipi di riferimento ...

expression as type 

è davvero lo stesso

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

tranne che expression viene valutata solo una volta.

In un cenno a Bill Clinton, con "è" in "espressione è di tipo", intendo "is".

Fondamentalmente, come indicano le altre risposte, significa che restituisce null quando il cast fallisce. Tuttavia, restituisce anche null quando il cast avrà successo ma il tipo è sbagliato.

Ecco un esempio un po 'sciocco:

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

ma

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

Qual è il valore di i? 52? No. È nullo

Perché l'oggetto lì dentro? Risulta che ho mentito sopra quando ho spiegato "come" in termini di "è".

Rispettare:

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

'i' è ora null

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

Ops. Errore del compilatore. Quindi, immagino che le due affermazioni non siano esattamente le stesse dopo tutto.

+2

In breve: is is is e as is also is is is. –

+0

Non solo, ma ho potuto scrivere C# che usa '?' come Lisp usa la parentesi. :-) – Justin

7

I casi d'uso dei due operatori sono superficialmente simili, ma semanticamente abbastanza diversi. Un cast comunica al lettore "Sono certo che questa conversione è legale e sono disposto a fare un'eccezione di runtime se sbaglio". L'operatore "as" comunica "Non so se questa conversione è legale o meno, faremo un tentativo e vediamo come va".

Per ulteriori informazioni su questo argomento si veda il mio articolo sul tema:

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

+1

Può comunicare ciò, ma non necessariamente. Ho usato la parola chiave 'as' quando sono sicuro che una conversione funzionerà, perché preferisco semplicemente guardare:' (myobj as MyType) .SomeProperty' over' ((MyType) myobj) .SomeProperty' In questo caso, il come ho fatto comunica che sono disposto a prendere una 'NullReferenceException' in runtime se non lo fa. Volevo solo sottolineare che è una cosa stilistica. – jasonh

+1

@jasonh - Usare 'as' in questo modo mi sembra stilisticamente sbagliato. Ci faremmo chiederci perché non è stato fatto un cast. Inoltre, un'eccezione di cast non valida potrebbe portare uno sviluppatore al problema più rapidamente di un'eccezione di riferimento null. Preferisco lo stile di Eric su questo. –

0

Lei non potrà mai ottenere un'eccezione conversione se si utilizza "come" parola chiave. Il risultato della conversione sarà null se stai provando una conversione non valida.

La conversione implicitamente/esplicita può essere utilizzata tra classi/interfacce con relazioni inherit/implement, altrimenti darà un errore di compilazione. Vedi l'esempio:

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

Un'altra situazione di implicitamente/esplicitamente la conversione è che non c'è alcuna relazione tra classe A e B, ma si scrive un implicit/explicit operatore di te stesso.

0

Inoltre, come può essere utilizzato solo con i tipi di riferimento. Questo è in realtà abbastanza logico, poiché se la conversione fallisce, restituisce false e questo non è un valore possibile per un tipo di valore.

Quindi, per i tipi di valore, è necessario utilizzare il normale typecasting.

Problemi correlati