Krótka odpowiedź:
DateTime?
jest tylko słodki składnia Nullable<DateTime>
który nie zawiera DateTime
„s właściwości i metody podczas operator Elvis działa na nie-Nullable Nullable<DateTime>.Value
.
Objaśnienie:
Następujący kod:
DateTime? dt = DateTime.Now;
string x;
if (dt != null)
x = dt?.ToString("dd/MM/yyyy");
Gdy decompiles jak C# 5.0
daje następujący wynik:
DateTime? nullable = new DateTime?(DateTime.Now);
if (nullable.HasValue)
{
string str = nullable.HasValue ? nullable.GetValueOrDefault().ToString("dd/MM/yyyy") : null;
}
Side uwaga: string
wydaje zadeklarowane wewnątrz if
ma znaczenia z powodu podnoszenia na poziomie MSIL
, a ponieważ wartość nie jest używany później na Dekompilator pokazuje go tak, jakby był to deklarowane wewnątrz tej if
zakresie.
Jak widać, a od DateTime?
jest tylko słodki składnia Nullable<DateTime>
, C#
ma konkretnego odniesienia do Nullable<T>
s z operatorem Elvis, dzięki czemu jego wartość zwracana T non-zerowalne sam .
Wynikiem całego Elvis operator
musi być Nullable
więc, jeśli chcesz otrzymywać niebędącą string
wartość musiałaby być Nullable<T>
lub ReferenceType
ale to nie zmienia faktu, że jeśli operator zdołał uzyskać wartość Nullable<DateTime>
- zwrócony DateTime
już nie jest Nullable<DateTime>
.
Po przeczytaniu odpowiedzi, nie mogę pomóc, ale czuję, że prawdziwe rozwiązanie problemu idzie tak: „Wystarczy użyć' dt.Value.ToString() 'już" –
Co zrobić, jeśli dt ma wartość zerową? –
Ya, po prostu wywołanie dt.Value.ToString() będzie wybuchać, jeśli dt ma wartość null; zdecydowanie chcesz korzystać z Operatora Elvisa, nie tylko dlatego, że ma on niesamowite imię, ale dlatego, że obsługuje dla ciebie czek NULL. dt? .Value.ToString() zasadniczo mówi: "Jeśli dt nie ma wartości NULL, wówczas uzyskaj dostęp do jego właściwości Value i przekonwertuj ją na łańcuch znaków, jeśli jest NULL, zignoruj połączenie i nie rób nic" –