c# ?: - ¿El operador “?.” Hace algo más aparte de verificar si está nulo?




2 Answers

Debido a que Nullable<T> se implementa en C # de una manera que hace que las instancias de esa estructura aparezcan como tipos anulables. Cuando tienes DateTime? en realidad es Nullable<DateTime> , cuando asigna null a eso, establece HasValue en false detrás de escena, cuando verifica null , está verificando HasValue , etc. el operador se implementa de manera tal que reemplaza los mismos modismos que funcionan para tipos de referencia también para estructuras anulables. Al igual que el resto del lenguaje, las estructuras anulables son similares a los tipos de referencia (con respecto a la null ).

usar como

Como sabrás, DateTime? no tiene un ToString parametrizado (a los efectos de formatear la salida), y hacer algo como

DateTime? dt = DateTime.Now;
string x;
if(dt != null)
    x = dt.ToString("dd/MM/yyyy");

tirará

Ninguna sobrecarga para el método 'ToString' toma 1 argumentos

Pero, desde C # 6.0 y el operador Elvis ( ?. ), El código anterior se puede reemplazar con

x = dt?.ToString("dd/MM/yyyy");

que .... funciona! ¿Por qué?




Considerando:

DateTime? dt = DateTime.Now;
string x;
if(dt != null)
    x = dt.ToString("dd/MM/yyyy");

Aquí dt es un DateTime? o Nullable<DateTime> witch no es IFormatable y no tiene un ToString(string format) .

Así que tirar.

Ahora considerando:

x = dt?.ToString("dd/MM/yyyy");

El ?. Es un azúcar sintáctico para:

dt.HasValue ? dt.Value.ToString("dd/MM/yyyy"): null

Aquí dt.Value es un DateTime que es IFormatable y tiene un ToString(string format) .

Finalmente, la buena manera de escribir el primer código en C # 5.0 es:

DateTime? dt = DateTime.Now;
string x;
if(dt.HasValue)
    x = dt.Value.ToString("dd/MM/yyyy");



Related