2009-07-07 17 views
124

chcę przekonwertować zerowalne DateTime (DateTime?) do DateTime, ale otrzymuję błąd:Jak przekonwertować DateTime? do DateTime

"Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)" 

próbowałem następujące:

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

Odpowiedz

250

chcesz użyć null-coalescing operator, który jest przeznaczony do dokładnie tego celu.

Korzystanie z niego kończy się na tym kodzie.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now; 
+0

tutaj jest urywek, którego użyłem w Presenter, wypełniając widok Nullable Date/Time: 'memDateLogin = m.memDateLogin ?? DateTime.MinValue' –

+0

'DateTime?"dawka nie zawiera definicji" Zaktualizowany Data " –

15

Trzeba nazwać Value Właściwość zerowalnego DateTime. To zwróci DateTime.

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

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

aby kod nieco łatwiejsze do odczytania, można użyć właściwości HasValue zamiast czeku null:

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

Można to uczynić jeszcze bardziej zwięzłym:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now; 
+0

+1 za jakość - i do zerowej koalescencyjne. –

0

Spróbuj tego:

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

Jak o następujące elementy:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now; 
39

Spróbuj

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now; 
+0

Najważniejszą rzeczą jest tutaj operator koalescencji zerowej, zobacz odpowiedź "chillery42" więcej informacji. – cspolton

72

MS już opracował metodę, więc nie trzeba używać operatora koalescencyjnego zerowego. Nie ma różnicy w funkcjonalności, ale dla osób nie będących ekspertami łatwiej jest uzyskać to, co dzieje się na pierwszy rzut oka.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now); 
+1

O wiele bardziej czytelna niż inne opcje. – Newbie

+0

Dzięki temu mój kod jest dużo bardziej czytelny. – Luke101

4

Oto urywek użyłem w Presenter napełniania widok z pustych Data/Czas

memDateLogin = m.memDateLogin ?? DateTime.MinValue 
3

Możesz także spróbować Nullable(T) Properties:

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

raczej łatwy następujące produkty znacznie lepiej

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

Można użyć prostego Obsada:

DateTime dtValue = (DateTime) dtNullAbleSource; 
+3

Idealne, jeśli sprawdzisz, czy var ma wartość zerową przed +1 –

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

Zwykle uważa się za dobry sposób na wyjaśnienie swoich sugestii/odpowiedzi. Odpowiedzi tylko na kod mogą być zaskakująco mało przydatne, nawet jeśli są poprawne technicznie. –

+0

@MaximilianAst tak masz rację, spróbuj wdrożyć sposób, jaki zaproponowałeś :) –

Powiązane problemy