2010-08-17 13 views
13

¿Por qué aparece esta advertencia en C# con Visual Studio 2010?C# si los operadores de taquigrafía de la declaración (? :) dan como resultado el código inalcanzable

"Unreachable expression code detected" 

desde el siguiente código (DateTime.Now subrayada en verde squiggly):

public DateTime StartDate 
{ 
    get 
    { 
    DateTime dt = (DateTime)ViewState["StartDate"]; 
    return ((dt == null) ? DateTime.Now : dt); 
    } 
} 
+4

Bien, porque 'DateTime' es una estructura y nunca puede ser' nulo'. Entonces, ¿qué valor comprobo en mi 'ViewState' está vacío? – JohnB

+0

'Expresión inalcanzable' suena bastante parecido a' Siempre evalúa como (VERDADERO | FALSO) '... ¿está seguro de que' dt' podría ser 'nulo'? ¿O el clásico 'if {} else {}' funciona bien? –

+0

Typos: Entonces, ¿qué valor debo verificar en caso de que mi 'ViewState' esté vacío? – JohnB

Respuesta

38

Debido a una estructura DateTime nunca puede ser nulo.

Si está esperando un posible valor nulo, debe usar una estructura de fecha y hora anulable. También puede utilizar el operador nulo coalescencia en lugar del operador condicional, así:

public DateTime StartDate 
{ 
    get 
    { 
     DateTime? dt = (DateTime?)ViewState["StartDate"]; 
     return dt ?? DateTime.Now; 
    } 
} 

O usted podría hacerlo como una sola línea (como en the comments):

public DateTime StartDate 
{ 
    get { return (DateTime)(ViewState["StartDate"] ?? DateTime.Now); } 
} 
+1

Entonces, ¿qué sucede si la clave "StartDate" no existe? – Blam

+5

@Blam: en ASP.NET, si la clave ViewState no existe, obtienes 'null'. A menudo expreso lo mismo que @Justin con una línea: 'return (DateTime) (ViewState [" StartDate "] ?? DateTime.Now);'. Funciona de maravilla. – kbrimington

+0

@Blam: ¡Estaba en el proceso de preguntarme a mí mismo! @Justin: ¡gran solución, gracias! – JohnB

3

Eso podría ser porque DateTime es una estructura (tipo de valor) & no es un tipo de referencia.
Por lo tanto, compararlo con nulo siempre será falso.

1

DateTime no puede ser nulo

4

DateTime es un tipo de valor, por lo que nunca puede ser nulo. Por lo tanto, la prueba para == null se evalúa como una constante falsa en tiempo de compilación, por lo que la mitad de?: Nunca se alcanzará en el tiempo de ejecución.

1

DateTime no puede contener nulos, por lo que su valor nunca será nulo.

4

Las respuestas ya dadas (que un tipo de valor que no admite nulos nunca será nulo y, por lo tanto, se sabe que la comparación devuelve falso en el momento de la compilación) son correctas, puede que se pregunte sobre la siguiente pregunta obvia : ¿por qué esto es legal? Esa pregunta se ha hecho muchas veces en SO; la versión corta es que C# proporciona un operador de igualdad "levantado" para cada estructura que proporciona un operador de igualdad en el tipo no anulable (si ya no existe uno elevado)

Es decir, porque DateTime proporciona un operador ==, el compilador genera automáticamente un operador == en DateTime ?, y que el operador es aplicable en su caso.

+0

Otra pregunta frecuente. ¿Por qué el compilador se olvida de emitir la otra advertencia? _El resultado de la expresión siempre es 'falso' ya que un valor de tipo 'System.DateTime' nunca es igual a 'nulo' de tipo 'System.DateTime?' _. Esta advertencia funciona (al menos la mayoría del tipo) de operadores de igualdad incorporados levantados '==', como en '42 == null', pero no funcionará para operadores definidos por el usuario' == 'como el de' DateTime', cuando se levantan. –

+1

@JeppeStigNielsen: La advertencia faltante era un error; Sospecho que lo presenté en C# 3. Cuando estaba en Microsoft, nunca fue una prioridad lo suficientemente alta como para que lo investigara por completo; No sé si fue arreglado en Roslyn o no. Lamento el error –

Cuestiones relacionadas