Rumah >pembangunan bahagian belakang >C++ >Mengapa C# Membenarkan Perbandingan Jenis Nilai kepada Null, Walaupun Mereka Sentiasa Menilai Menjadi Palsu?

Mengapa C# Membenarkan Perbandingan Jenis Nilai kepada Null, Walaupun Mereka Sentiasa Menilai Menjadi Palsu?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-16 18:30:10901semak imbas

Why Does C# Allow Value Type Comparisons to Null, Even Though They Always Evaluate to False?

Tingkah laku tidak dijangka bagi perbandingan nol jenis nilai C#

Dalam C#, jenis nilai seperti integer dan DateTime biasanya tidak boleh dibatalkan, yang bermaksud ia tidak boleh diberikan kepada null. Walau bagaimanapun, dalam beberapa kes, C# membenarkan membandingkan jenis nilai kepada null tanpa membuang ralat.

Leraian beban operator dan jenis boleh batal

Salah satu sebab ada kaitan dengan resolusi beban operator. C# menyokong pembebanan operator, membenarkan pembangun untuk menentukan pengendali tersuai untuk kelas mereka. Untuk pengendali kesaksamaan (==), terdapat pengendali yang ditakrifkan untuk jenis nilai boleh batal.

Pertimbangkan coretan kod berikut:

<code class="language-csharp">Int32 x = 1;
if (x == null) { ... }</code>

Kod ini disusun kerana pengkompil C# menemui beban berlebihan yang sesuai bagi pengendali kesamaan. int pembolehubah tempatan secara tersirat boleh ditukar kepada integer boleh null (int?), dan literal null juga integer boleh null. Oleh itu, operator == boleh digunakan pada kedua-dua integer boleh null.

Walaupun ungkapan (x == null) sentiasa dinilai palsu, ia dianggap sebagai perbandingan yang sah.

Tukar kepada jenis nullable

Situasi lain ialah apabila anda cuba membandingkan jenis nilai dengan rujukan objek nol. Contohnya:

<code class="language-csharp">object o = null;
if (x == o) { ... }</code>

Dalam kes ini, pembolehubah int x akan ditukar kepada objek jenis, membenarkan perbandingan dengan null. Walau bagaimanapun, keputusan perbandingan ini sentiasa palsu.

Struktur boleh null dan ungkapan bersyarat

Ahli statik struktur, seperti DateTime.Now, boleh kosong secara lalai. Ini bermakna anda boleh membandingkannya dengan null tetapi konteksnya mesti diambil kira. Dalam contoh anda:

<code class="language-csharp">if (test.ADate == null) { ... }</code>

Ujian ungkapan.ADate boleh dibatalkan kerana ia merupakan ahli struktur, walaupun ia tidak diisytiharkan boleh batal secara eksplisit. Walau bagaimanapun, perbandingan dengan null masih dianggap sebagai ungkapan malar, jadi ia sentiasa menilai palsu.

Ringkasnya, C# membenarkan membandingkan jenis nilai kepada null terima kasih kepada resolusi beban operator dan penukaran automatik. Walau bagaimanapun, adalah penting untuk memahami bahawa hasil perbandingan ini sentiasa palsu kerana jenis nilai tidak boleh diberikan kepada null.

Atas ialah kandungan terperinci Mengapa C# Membenarkan Perbandingan Jenis Nilai kepada Null, Walaupun Mereka Sentiasa Menilai Menjadi Palsu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn