Jak przekonwertować DateTime? do DateTime

171

Chcę przekonwertować DateTime ( DateTime?) dopuszczającą wartość null na a DateTime, ale pojawia się błąd:

Nie można niejawnie przekonwertować typu „System.DateTime”? do „System.DateTime”. Istnieje jawna konwersja (brakuje Ci obsady?)

Próbowałem wykonać następujące czynności:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;
Waheed
źródło

Odpowiedzi:

304

Chcesz użyć operatora łączącego wartości null , który jest przeznaczony dokładnie do tego celu.

Używając go, otrzymasz ten kod.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
dreszcze 42
źródło
1
oto fragment, którego użyłem w Prezenterze, wypełniając widok datą / godziną zerową: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
„DateTime?” dawka nie zawiera definicji „UpdatedDate”
Vasil Valchev
88

Firma MS już stworzyła metodę do tego, więc nie musisz używać operatora koalescencji zerowej. Nie ma różnicy w funkcjonalności, ale osobom nie będącym ekspertami łatwiej jest zorientować się, co się dzieje.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);
Josh
źródło
43

Spróbuj tego

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
Walentyna Wasiljewa
źródło
Kluczową rzeczą jest tutaj operator koalescencji zerowej, zobacz odpowiedź chills42, aby uzyskać więcej informacji.
cspolton
24

Możesz użyć prostej obsady:

DateTime dtValue = (DateTime) dtNullAbleSource;

Jak powiedział Leandro Tupone, musisz wcześniej sprawdzić, czy var jest zerowy

César León
źródło
6
Idealnie, jeśli sprawdzisz, czy var jest zerowy przed +1
Leandro
22

Musisz wywołać właściwość Value DateTime dopuszczającej wartość null. To zwróci DateTime.

Zakładając, że tak UpdatedDatejest DateTime?, to powinno działać:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;

Aby nieco ułatwić czytanie kodu, zamiast nullsprawdzania można użyć właściwości HasValue :

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue
                          ? _objHotelPackageOrder.UpdatedDate.Value
                          : DateTime.Now;

Można to zrobić jeszcze bardziej zwięźle:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
adrianbanks
źródło
6

A co z następującymi:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now;
Simon Wilson
źródło
6

Oto fragment, którego użyłem w Prezenterze, wypełniając widok datą / godziną dopuszczającą wartość zerową

memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
źródło
3

Możesz także wypróbować właściwości Nullable (T) :

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Mateusz Rogulski
źródło
1

Rozważ skorzystanie z poniższego, które jest znacznie lepsze niż zaakceptowana odpowiedź

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;
Sadiqabbas Hirani
źródło
Możesz powiedzieć, dlaczego jest lepiej?
n4rzul
0

Spróbuj tego:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Tim S. Van Haren
źródło
0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;
Surowe Vyas
źródło
4
Wyjaśnienie sugestii / odpowiedzi jest zwykle uważane za dobrą formę. Odpowiedzi zawierające tylko kod mogą być zaskakująco mało informacyjne, nawet jeśli są poprawne technicznie.
Maximilian Ast
1
@MaximilianAst tak, masz rację, spróbujesz wdrożyć sposób, w jaki zasugerowałeś :)
Harsh Vyas