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;

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;

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);

43

Spróbuj tego

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

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


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;

6

A co z następującymi:

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

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


1

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

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

Możesz powiedzieć, dlaczego jest lepiej?
n4rzul

0

Spróbuj tego:

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.