2011-08-18 6 views
19

In base alla documentazione dello as operator, as "viene utilizzato per eseguire determinati tipi di conversioni tra tipi di riferimento compatibili". Dal momento che Nullable is actually a value type, mi aspetterei che as non funzioni con esso. Tuttavia, questo codice viene compilato ed eseguito:Perché l'operatore as può essere utilizzato con Nullable <T>?

object o = 7; 
int i = o as int? ?? -1; 
Console.WriteLine(i); // output: 7 

È questo comportamento corretto? La documentazione per as è errata? Mi sto perdendo qualcosa?

+3

Nullable è un tipo di valore, ho corretto il testo. –

+0

@ Matthew: Grazie. Era un errore di battitura piuttosto confuso. – recursive

+1

Grande discussione su AS/IS e Nullables - http://stackoverflow.com/questions/1583050/performance-surprise-with-as-and-nullable-types – sll

risposta

21

È corretto questo comportamento?

Sì.

La documentazione è errata?

Sì. Ho informato il responsabile della documentazione. Grazie per averlo portato alla mia attenzione, e mi scuso per l'errore. Ovviamente nessuno si è ricordato di aggiornare questa pagina quando sono stati aggiunti tipi nullable alla lingua in C# 2.0.

Mi manca qualcosa?

Si potrebbe prendere in considerazione la lettura delle specifiche C# piuttosto che la documentazione MSDN; è più definitivo.

2

ho letto:

Si noti che l'operatore as esegue solo le conversioni di riferimento e le conversioni di pugilato. L'operatore as non può eseguire altre conversioni, come le conversioni definite dall'utente, che dovrebbero invece essere eseguite utilizzando le espressioni di trasmissione.

e conversioni boxe .....

+0

Ma non è solo semplice boxe, dato che era solo un normale ' int' che era in scatola, e un 'int?' che è l'obiettivo di 'as'. – recursive

+0

Perché pensi int? deve essere gestito in modo diverso dalla prospettiva di questo problema? – Tigran

+0

Non so perché è diverso. In un certo senso, è legato a ciò che sto chiedendo. – recursive

1

Solo una supposizione, ma direi che scatole o come un intero e poi lo converte in un annullabile.

+1

Quasi. Si * cancella * l'oggetto come numero intero se è un numero intero e quindi lo converte in un valore nullo. Se l'unboxing fallisce, il risultato è ovviamente un null nullable int. –

0

Stai applicando il 'come' a Oggetto, che è un tipo di riferimento. Potrebbe essere nullo, nel qual caso il CLR ha un supporto speciale per annullare la selezione del riferimento "null" su un tipo di valore nullable. Questo speciale unboxing non è supportato per nessun altro tipo di valore, quindi, anche se Nullable è un tipo di valore, ha determinati privilegi speciali.

1

Dalla documentazione sulla come parola chiave:

E 'equivalente alla seguente espressione, tranne che espressione viene valutata solo una volta.

espressione è tipo? (Tipo) espressione: (tipo) null

La domanda di è uso anche afferma che funziona con i tipi di riferimento, tuttavia, si può anche fare cose come questa:

int? temp = null; 
if (temp is int?) 
{ 
    // Do something 
} 

Sono indovinando è solo un'inesattezza nella documentazione di riferimento in quanto il tipo deve essere nullable (vale a dire un tipo nullable o un tipo di riferimento) anziché solo un tipo di riferimento.

1

Apparentemente la documentazione MSDN su as operator deve essere aggiornata.

object o = 7; 
int i = o as **int** ?? -1; 
Console.WriteLine(i); 

Se si tenta il seguente codice in cui usiamo l'operatore as con il tipo di valore int, si ottiene il messaggio di errore del compilatore opportuno che

Il come operatore deve essere utilizzato con un tipo di riferimento o tipo annullabile ('int' è un tipo di valore non annullabile)

C'è un aggiornamento anche se su the link nella sezione contenuti Community che cita:

The as operator must be used with a reference type or nullable type. 
Problemi correlati