2012-05-09 8 views
6

Quando abbiamo due strutture e una è implicitamente convertibile nell'altra, sembra che le versioni System.Nullable<> dei due siano anche implicitamente convertibili. Ad esempio, se la struct A ha una conversione implicita nella struct B, quindi A? converte anche in B?."Covarianza" della struttura System.Nullable <>

Ecco un esempio:

struct MyNumber 
{ 
    public readonly int Inner; 

    public MyNumber(int i) 
    { 
    Inner = i; 
    } 

    public static implicit operator int(MyNumber n) 
    { 
    return n.Inner; 
    } 
} 

All'interno di un metodo:

MyNumber? nmn = new MyNumber(42); 
int? covariantMagic = nmn; // works! 

Nel linguaggio C# Specification Version 4.0 si legge che una conversione del genere deve esistere per "l'identità implicita predefinito e conversioni numeriche ".

Ma è sicuro assumere che funzionerà anche per le conversioni implicite definite dall'utente?

(Questa domanda potrebbe essere correlato a questo bug: http://connect.microsoft.com/VisualStudio/feedback/details/642227/)

risposta

6

Ma è lecito ritenere che funzionerà anche per le conversioni implicite definite dall'utente?

Sì. Dalla sezione 6.4.2 del C# 4 spec:

dato un operatore di conversione definito dall'utente che convers da un non annullabile tipo di valore S ad un non annullabile tipo di valore T, un operatore di conversione sollevato esiste che converte da S? a T?. Questo operatore conversione sollevato esegue unwrapping da S? a S seguita dalla conversione definita dall'utente da S a T, seguita da un involucro da T a T?, tranne che un Null-valued S? converte direttamente ad un null valori T?.

Un operatore di conversione sollevato ha la stessa classificazione implicita o esplicita dell'operatore di conversione definito dall'utente sottostante. Il termine "conversione definita dall'utente" si applica all'uso di operatori di conversione definiti dall'utente e sollevati.

+4

Avete persino il tempo di guardare queste citazioni o di digitare semplicemente a mano? – Blindy

+0

@Blindy: entrambi! Ho una copia cartacea delle specifiche sulla mia scrivania e ho copiato questa sezione digitando ... quindi qualsiasi refuso! –

+0

Hmm, mi mancava la sezione 6.4.2 e avevo letto solo 6.1.4. Grazie. –

Problemi correlati