2011-03-23 10 views
13

No estoy seguro de cuándo/si la propiedad Value en tipos anulables debe utilizarse al obtener el valor contenido en un tipo que admite nulos. Considere el siguiente ejemplo:C# Nullable Types y la propiedad Value

int? x = 10; 

Console.WriteLine("The value of 'x' is " + x.Value); 
Console.WriteLine("The value of 'x' is " + x); 

Ambos devuelven el mismo valor (10).

Sin embargo, si inicialmente configuré x en null, la primera Console.WriteLine arroja una excepción y la segunda no.

Entonces, mi pregunta es esta. ¿De qué sirve usar la propiedad Value? No parece ser necesario para obtener el valor real (incluso si es null) y lanzará una excepción si el valor es realmente null.

Respuesta

20

Es es necesario generalmente - simplemente no en su caso particular. El tipo de x es Nullable<int>, no int - y no hay conversión implícita de Nullable<T> a T.

Sin embargo, veamos lo que sucede en su ejemplo. Su última línea se está convirtiendo en:

Console.WriteLine(string.Concat("The value of 'x' is ", x)); 

Ese es el boxeo x, lo que resultará en ya sea una caja int o una referencia nula ... ambos de los cuales son manejados por string.Concat.

Cuando está no convirtiendo a una cadena a través de la concatenación de cadenas, p. si quería:

int nonNullable = x.Value; 

entonces hacer tiene que utilizar la propiedad Value - o una conversión explícita, o posiblemente un operador coalescente nula, o una llamada a GetValueOrDefault:

int nonNullable = (int) x; 
int alternative = x ?? 20; 
int andAnother = x.GetValueOrDefault(20); 
+1

O posiblemente x.GetValueOrDefault (20), sin embargo coalescente nula es, obviamente, muy bien, no sabía que era posible. – jishi

+0

@jishi: Buena opción, lo agregaré allí. –

5

x y x.Value tienen diferentes tipos.

static void Meth(int i) 
    { 
     int? x = 5; 
     Meth(x); 
     Meth(x.Value); 
    } 

La segunda línea no se compila.

Por lo tanto, es obvio el motivo de usar x.Value; debe llamarlo cuando necesite el valor real. Y NullReferenceException es razonable, porque null no corresponde al valor del tipo de valor.

+0

Pero puede tener 'Meth ((int) x);' y se compilará. :) –

+2

@Shadow Wizard '(int) x' es lo mismo que' x.Value' – Andrey

0

Debe acceder a la propiedad Value si la propiedad HasValue devuelve verdadero; de lo contrario, obtendrá una excepción. Su ejemplo funciona porque Nullable ha sobrecargado el método ToString() y el compilador C# admite accesos directos para este tipo.

0

cuando x es nulo x.Value lanzará un sistema.InvalidOperationException excepción (no importa cuál es el tipo de x)

string + null = string: no es una excepción

0

Si desea utilizar .value para un int anulable. se puede comprobar el valor como esto

int? x = null; 
int valXX = x.HasValue ? x.Value : 0; 
Console.WriteLine("The value of 'x' is ->" + x + "<-"); 
Console.WriteLine("The value of 'valXX' is ->" + valXX + "<-"); 
Cuestiones relacionadas