Bisakah seseorang menjelaskan mengapa ini bekerja di C # .NET 2.0:
Nullable<DateTime> foo;
if (true)
foo = null;
else
foo = new DateTime(0);
... tapi ini tidak:
Nullable<DateTime> foo;
foo = true ? null : new DateTime(0);
Bentuk terakhir memberi saya kesalahan kompilasi "Jenis ekspresi kondisional tidak dapat ditentukan karena tidak ada konversi implisit antara '<null>' dan 'System.DateTime'."
Bukannya saya tidak bisa menggunakan yang pertama, tetapi gaya kedua lebih konsisten dengan sisa kode saya.
c#
generics
nullable
conditional-operator
Nick Gotch
sumber
sumber
Jawaban:
Pertanyaan ini sudah ditanyakan beberapa kali. Compiler memberitahu Anda bahwa ia tidak tahu bagaimana mengubahnya
null
menjadiDateTime
.Solusinya sederhana:
Catatan yang
Nullable<DateTime>
dapat ditulisDateTime?
yang akan menghemat banyak mengetik.sumber
<null>
danDateTime
bukannya menemukan tipe leluhur yang sama, ia hanya mencoba untuk menemukan pertobatan di antara yang lain. (Bit ekstra: C # mengenali<null>
tipe, yaitu tipe setiapnull
ekspresi.)FYI (Offtopic, tapi bagus dan terkait dengan tipe nullable) kami memiliki operator yang berguna hanya untuk tipe nullable yang disebut operator penggabungan nol
Digunakan seperti ini:
sumber
Itu karena di operator ternary, dua nilai harus menyelesaikan ke tipe yang sama.
sumber
Saya tahu pertanyaan ini ditanyakan pada tahun 2008 dan sekarang 5 tahun kemudian tetapi jawaban yang ditandai sebagai jawaban tidak memuaskan saya. Jawaban sebenarnya adalah DateTime adalah sebuah struct, dan sebagai sebuah struct, itu tidak kompatibel dengan null. Anda memiliki dua cara untuk menyelesaikannya:
Pertama adalah membuat null kompatibel dengan DateTime (misalnya, masukkan null ke DateTime? Seperti yang dikatakan oleh pria dengan 70 upvotes, atau nol untuk Object atau ValueType).
Yang kedua adalah untuk membuat DateTime kompatibel dengan nol (misalnya, melemparkan DateTime ke DateTime?).
sumber
Solusi lain yang mirip dengan yang diterima adalah dengan menggunakan
default
kata kunci C # . Meskipun didefinisikan menggunakan obat generik, sebenarnya ini berlaku untuk semua jenis.Contoh penggunaan yang diterapkan pada pertanyaan OP:
Contoh penggunaan dengan jawaban yang diterima saat ini:
Selain itu, dengan menggunakan
default
, Anda tidak perlu menentukan variabel sepertinullable
untuk memberikannull
nilai. Kompiler akan secara otomatis menetapkan nilai default tipe variabel tertentu dan tidak akan ada kesalahan yang terjadi. Contoh:sumber
default(DateTime)
bukan nol, ini "1.1.0001 0:00:00
", sama dengannew DateTime(0)
.null
, hanya dengan menggunakandefault()
Anda dapat menetapkannya kenullable
nilai (seperti yang dinyatakan MSDN). Contoh saya menunjukkan menunjukkan fleksibilitas yang dapat digunakan denganNullable<DateTime>
,DateTime?
, dan hanyaDateTime
. Jika Anda yakin ini tidak benar, dapatkah Anda memberikan PoC jika gagal?null
dalam variabel, bukandefault(DateTime)
, jadi ini menyesatkan terbaik. Ini bukan "serbaguna" seperti yang Anda maksudkan, karena ekspresi secara keseluruhan masih memiliki tipe yang sama -DateTime
, dan Anda dapat menggantinyadefault(DateTime)
dengannew DateTime()
dan itu akan melakukan hal yang sama. Mungkindefault(DateTime?)
itu yang Anda maksudkan, karena itu sebenarnya sama dengannull
.