Pertanyaan Dapat menetapkan nol? [duplikat]


Kemungkinan Duplikat:
Bagaimana cara memeriksa apakah suatu objek dapat ditunda?
Tentukan apakah properti yang dipantulkan dapat ditetapkan nol 

Bagaimana saya bisa mengidentifikasi dengan tepat apakah suatu variabel (atau anggota kelas) dari tipe yang diberikan dapat mengambil null? Lebih spesifik bagaimana menangani Nullable<T> karena ini bukan tipe referensi? Atau jenis lain yang mungkin memiliki beberapa konversi implisit aneh didefinisikan di atasnya. Perasaan saya adalah bahwa satu-satunya cara pasti untuk mengetahuinya adalah try{} catch{} dan melihat apakah itu meledak ... Tapi mungkin ada beberapa trik untuk itu.


4
2018-03-10 15:58


asal


Jawaban:


Tidak jelas apa informasi Anda melakukan miliki tentang jenis yang dimaksud.

coba / tangkap akan melakukan banyak hal eksekusi waktu, yang sebenarnya bukan yang Anda inginkan.

Untuk tipe konkret, Anda harus dapat mengetahui hanya dengan mengetahui jenis variabel. Ini harus cukup jelas - atau jika tidak, Anda punya masalah yang lebih besar daripada tidak mengetahui tentang nullity :)

Untuk sebuah umum ketik, saya telah menemukan ini sangat berguna:

if (default(T) == null)

Untuk sebuah Type referensi (misalnya jika Anda menggunakan refleksi), Anda dapat menggunakan:

if (!type.IsValueType || Nullable.GetUnderlyingType(type) != null)

12
2018-03-10 16:00



bool canBeNull = !type.IsValueType || (Nullable.GetUnderlyingType(type) != null);

1
2018-03-10 16:03



Hanya tipe referensi dapat benar-benar memiliki referensi nol; kasus khusus Nullable<T> semua gula sintaksis; nilai yang dihasilkan tidak benar-benar nol (sejak Nullable<T> adalah tipe nilai, juga, sehingga tidak bisa menahan referensi nol), itu hanya a Nullable<T> dengan default(T) sebagai Nilai dan HasValue = false.

Jadi itu tergantung pada apa yang Anda minta.

Jika Anda mencoba menentukan apakah tipe tersebut memenuhi syarat untuk penugasan dalam kode ke null (Nothing dalam VB.NET) literal, maka itu:

  • Semua tipe referensi
  • Nullable<T>

Jika Anda mencoba untuk menentukan apakah jenis memenuhi syarat untuk memegang referensi nol bona-fide, maka itu

  • Semua tipe referensi

Adapun menggunakan refleksi untuk memeriksa jenis tertentu saat runtime, memeriksa IsValueType seharusnya cukup untuk membuat Anda mendapatkan apa yang Anda butuhkan, bahkan jika itu yang pertama (tambahkan saja kasus khusus dalam kode Anda untuk Nullable<T>).


1
2018-03-10 16:02



Nullable mengekspos HasValue properti jadi jika Anda ingin memeriksa apakah jenis nilai nullable maka hanya memeriksa apakah itu mengekspos Properti itu.


0
2018-03-10 16:02