2012-05-09 15 views
6

Cuando tenemos dos estructuras, y una es implícitamente convertible a la otra, entonces parece que las versiones System.Nullable<> de las dos también son implícitamente convertibles. Al igual que si struct A tiene una conversión implícita a struct B, entonces A? también se convierte en B?."Covarianza" de System.Nullable <> struct

Aquí se muestra un ejemplo:

struct MyNumber 
{ 
    public readonly int Inner; 

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

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

Dentro de algún método:

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

En el lenguaje C# Specification Version 4.0 leemos que una conversión como éste deberá existir para "la identidad implícita predefinida y conversiones numéricas ".

Pero es seguro asumir que también funcionará para las conversiones implícitas definidas por el usuario?

(Esta pregunta podría estar relacionado con este error: http://connect.microsoft.com/VisualStudio/feedback/details/642227/)

Respuesta

6

Pero, ¿es seguro asumir que también funcionará para las conversiones implícitas definidas por el usuario?

Sí. De la sección 6.4.2 de la C# 4 spec:

Dada existe un operador de conversión definida por el usuario que convers desde un valor no anulable tipo S a un tipo de valor no anulable T, un operador de conversión levantado que se convierte de S? a T?. Este operador de conversión levantado realiza una desenvolver S?-S seguido de la conversión definida por el usuario S-T, seguido por una envoltura de T a T?, excepto que un nulo de valor S? convierte directamente a un nulo de valor T?.

Un operador de conversión elevado tiene la misma clasificación implícita o explícita que su operador de conversión subyacente definido por el usuario. El término "conversión definida por el usuario" se aplica al uso de operadores de conversión definidos y definidos por el usuario.

+4

¿Incluso tiene tiempo para buscar estas cotizaciones o simplemente las escribe a mano? – Blindy

+0

@Blindy: ¡Ambos! Tengo una copia impresa de la especificación en mi escritorio, y copié esta sección escribiendo ... ¡de ahí cualquier error tipográfico! –

+0

Hmm, me perdí la sección 6.4.2 y solo había leído 6.1.4. Gracias. –

Cuestiones relacionadas