C #: ใช้ Coalesing หรือ Ternary Operator กับ Datetime Nullable

Sep 11 2020

ฉันจะใช้ Null Coalescing Operator กับ Datetime Nullable ใน C # ได้อย่างไร พยายามสร้างคำสั่งบรรทัดเดียวในแบบสอบถามแบบเลือกใน Linq การติดตามไม่ทำงาน

select new ProductRDto
{
    EffectiveEndDate = timeslice.EffectiveEndDate.HasValue ?? timeslice.EffectiveEndDate.Value.Year : null 

Ternary Operator สร้างข้อผิดพลาดนี้

ข้อผิดพลาด: Operator '??' ไม่สามารถใช้กับตัวถูกดำเนินการประเภท 'bool' และ 'int'

  EffectiveEndDate = timeslice.EffectiveEndDate.HasValue ? timeslice.EffectiveEndDate.Value.Year : null

ข้อผิดพลาด: ไม่สามารถระบุประเภทของนิพจน์ตามเงื่อนไขได้เนื่องจากไม่มีการแปลงโดยนัยระหว่าง 'int' และ 'null'

* พยายามไม่ใช้คำสั่ง if-else

คำตอบ

5 JonSkeet Sep 11 2020 at 03:24

สมมติว่าสิ่งที่คุณจริงต้องการเป็นปีของtimeslice.EffectiveEndDateว่าที่ไม่เป็นโมฆะหรือค่า null มิฉะนั้นตัวเลือกที่ง่ายที่สุดคือไม่ได้ที่จะใช้อย่างใดอย่างหนึ่งผู้ประกอบการที่มีเงื่อนไขหรือโมฆะหลอมรวมผู้ประกอบการ - ใช้ประกอบ null เงื่อนไขแทน:

int? year = timeslice.EffectiveEndDate?.Year;

คุณจะใช้ตัวดำเนินการการรวมกันเป็นโมฆะเพื่อใช้ค่าอื่นแทนEffectiveEndDateเช่น

DateTime? date = timeslice.EffectiveEndDate ?? defaultEndDate;

หากคุณต้องการใช้ตัวดำเนินการเงื่อนไขแทนคุณเพียงแค่ระบุว่าคุณต้องการให้nullค่าเป็นประเภทint?:

int? year = timeslice.EffectiveEndDate.HasValue
    ? timeslice.EffectiveEndDate.Value.Year
    : (int?) null;
1 rory.ap Sep 11 2020 at 03:23

คุณกำลังผสมตัวดำเนินการการรวมกันแบบ null กับตัวดำเนินการที่เกี่ยวข้อง ?คุณต้องการที่จะใช้เพียงหนึ่ง

EffectiveEndDate = timeslice.EffectiveEndDate.HasValue
    ? timeslice.EffectiveEndDate.Value.Year : null;