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.