Réponse courte:
DateTime?
n'est qu'un doux syntaxe pour Nullable<DateTime>
qui ne contient pas d' DateTime
s'propriétés et de la méthode alors que la Elvis opérateur travaille sur la non-Nullable Nullable<DateTime>.Value
.
Explication:
Le code suivant:
DateTime? dt = DateTime.Now;
string x;
if (dt != null)
x = dt?.ToString("dd/MM/yyyy");
Lors de la décompilation, comme C# 5.0
donne le résultat suivant:
DateTime? nullable = new DateTime?(DateTime.Now);
if (nullable.HasValue)
{
string str = nullable.HasValue ? nullable.GetValueOrDefault().ToString("dd/MM/yyyy") : null;
}
Remarque: l' string
semble déclarée à l'intérieur de l' if
n'est pas pertinent parce que de brandir au MSIL
de niveau, et comme la valeur n'est pas utilisée plus tard le decompiler montre comme si elle a été déclarée à l'intérieur qu' if
de la portée.
Comme vous le voyez, et depuis DateTime?
n'est qu'un doux syntaxe pour Nullable<DateTime>
, C#
a une référence spécifique pour l' Nullable<T>
s avec le Elvis de l'opérateur, ce qui rend sa valeur de retour non nullable T lui-même.
Le résultat de l'ensemble de l' Elvis operator
doit Nullable
donc, si vous voulez recevoir un non-string
de la valeur qu'il devrait être Nullable<T>
ou ReferenceType
mais cela ne change pas le fait que si l'opérateur a réussi à obtenir l' Nullable<DateTime>
la valeur elle-même - le retour de l' DateTime
n'est Nullable<DateTime>
plus.