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


Answers

Respuesta corta:

DateTime? es solo una sintaxis dulce para Nullable<DateTime> que no contiene las propiedades y el método de DateTime , mientras que el operador de Elvis funciona en el valor no válido de Nullable<DateTime>.Value .

Explicación:

El siguiente código:

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

Cuando se descompila como C# 5.0 obtiene el siguiente resultado:

DateTime? nullable = new DateTime?(DateTime.Now);
if (nullable.HasValue)
{
    string str = nullable.HasValue ? nullable.GetValueOrDefault().ToString("dd/MM/yyyy") : null;
}

Nota al margen: la string parece declarada dentro de if es irrelevante debido a la elevación en el nivel de MSIL , y dado que el valor no se usa más adelante, el descompilador lo muestra como si hubiera sido declarado dentro de ese alcance.

Como ves, y desde DateTime? es solo una sintaxis dulce para Nullable<DateTime> , C# tiene una referencia específica para Nullable<T> s con el operador Elvis , haciendo que su valor de retorno sea la T no anulable .

El resultado de todo el Elvis operator debe ser Nullable , por Nullable tanto, si desea recibir un valor no de string , debe ser Nullable<T> o un ReferenceType pero esto no cambia el hecho de que si el operador ha logrado obtenga el Nullable<DateTime> sí mismo - DateTime devuelto ya no es Nullable<DateTime> .

Question

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é?




Related