วิธีการแปลง DateTime เป็น DateTime


171

ฉันต้องการแปลง DateTime เป็นโมฆะ ( DateTime?) เป็น a DateTimeแต่ฉันได้รับข้อผิดพลาด:

ไม่สามารถแปลงประเภท 'System.DateTime?' โดยปริยาย เป็น 'System.DateTime' มีการแปลงอย่างชัดเจนอยู่ (คุณพลาดการส่งหรือไม่)

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

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

คำตอบ:


304

คุณต้องการใช้ตัวดำเนินการรวมศูนย์ว่างซึ่งออกแบบมาเพื่อจุดประสงค์นี้อย่างแท้จริง

ใช้มันคุณท้ายด้วยรหัสนี้

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

1
นี่คือตัวอย่างข้อมูลที่ฉันใช้ภายในผู้นำเสนอกรอกข้อมูลวันที่ / เวลา: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram

'วันเวลา?' ขนาดไม่มีคำจำกัดความสำหรับ 'UpdatedDate'
Vasil Valchev

88

MS ได้สร้างวิธีการนี้แล้วดังนั้นคุณไม่จำเป็นต้องใช้ตัวดำเนินการรวมศูนย์ว่าง ไม่มีความแตกต่างในการใช้งาน แต่ง่ายกว่าสำหรับผู้ที่ไม่ใช่ผู้เชี่ยวชาญที่จะได้รับสิ่งที่เกิดขึ้นได้อย่างรวดเร็ว

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

43

ลองสิ่งนี้

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

สิ่งสำคัญที่นี่คือผู้ประกอบการ null รวมดูคำตอบของ chills42 ข้อมูลเพิ่มเติม
cspolton

24

คุณสามารถใช้การส่งแบบง่าย:

DateTime dtValue = (DateTime) dtNullAbleSource;

ดังที่ Leandro Tupone กล่าวว่าคุณต้องตรวจสอบว่า var นั้นเป็นโมฆะก่อนหรือไม่


6
สมบูรณ์แบบถ้าคุณตรวจสอบว่า var เป็นโมฆะก่อน +1
Leandro

22

คุณต้องเรียกใช้คุณสมบัติค่าของ DateTime ที่เป็นโมฆะ นี่จะส่งคืน DateTime

ถ้าUpdatedDateเป็นDateTime?เช่นนั้นสิ่งนี้น่าจะใช้ได้:

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

ในการทำให้โค้ดอ่านง่ายขึ้นคุณสามารถใช้คุณสมบัติHasValueแทนการnullตรวจสอบ:

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

สิ่งนี้สามารถทำให้รัดกุมยิ่งขึ้น:

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

6

วิธีการเกี่ยวกับต่อไปนี้:

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

6

นี่คือตัวอย่างข้อมูลที่ฉันใช้ภายใน Presenter ที่เติมมุมมองด้วย Nullable Date / Time

memDateLogin = m.memDateLogin ?? DateTime.MinValue


1

พิจารณาใช้สิ่งต่อไปนี้ซึ่งดีกว่าคำตอบที่ยอมรับได้

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

อยากบอกว่าทำไมมันถึงดีกว่า
n4rzul


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

4
ถือว่าเป็นรูปแบบที่ดีในการอธิบายคำแนะนำ / คำตอบ คำตอบของรหัสเท่านั้นอาจไม่แปลกใจแม้ว่าจะถูกต้องทางเทคนิคก็ตาม
Maximilian Ast

1
@MaximilianAst ใช่คุณมีสิทธิที่จะพยายามที่จะใช้วิธีการที่คุณมีข้อเสนอแนะ :)
รุนแรง Vyas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.