Bisakah Anda menjelaskan, mengapa Console.WriteLine menulis baris kosong ( Console.WriteLine(null)
beri saya kesalahan kompilasi) dan mengapa tidak ada NullReferenceException (bahkan a+=1
tidak boleh menaikkannya)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
++
,+=
dan+
telah mengangkat varian. Oleh karena itu laporana++;
,a += 1;
dana = a + 1;
semua diperbolehkan. Setiap produknull
(tidak terkecuali dibuang) jikaa
awalnyanull
.NullReferenceException
? tetapiint?
bukanReference
, itu hanyaint
yang dapat mengambilnull
nilaiJawaban:
Anda sedang mengamati efek dari operator yang diangkat .
Dari bagian 7.3.7 spesifikasi C # 5:
Jadi pada dasarnya,
a++
dalam hal ini adalah ekspresi dengan hasilnull
(sebagaiint?
) dan variabel tidak tersentuh.Saat Anda menelepon
yang dimasukkan ke dalam kotak
object
, yang mengubahnya menjadi referensi null, yang dicetak sebagai baris kosong.sumber
Console.WriteLine(a == null ? "null" : a)
?a
adalah tipeint?
, saya akan mengatakana ?? "null"
tidak menemukan tipe umum untuk dua operan. Anda membutuhkan petunjuk yangobject
merupakan tipe umum. Jadi gunakan salah satu operan untuk itu. Thea
akan kotak. Misalnya((object)a) ?? "null"
ataua ?? (object)"null"
.Jawaban Jon benar tetapi saya akan menambahkan beberapa catatan tambahan.
Ada 19 beban berlebih dari
Console.WriteLine
dan tiga di antaranya berlaku untuknull
: satu yang menerima astring
, satu yang mengambilchar[]
dan satu yang mengambilobject
. C # tidak dapat menentukan yang mana dari ketiga ini yang Anda maksud, jadi ini memberikan kesalahan.Console.WriteLine((object)null)
akan legal karena sekarang sudah jelas.a
adalah nullint?
. Resolusi kelebihan beban memilihobject
versi metode, sehinggaint?
dimasukkan kotak ke referensi null. Jadi ini pada dasarnya sama denganConsole.WriteLine((object)null)
, yang menulis baris kosong.Di mana referensi nol yang Anda khawatirkan?
a
adalah nullint?
yang bukan merupakan tipe referensi untuk memulai! Ingat, tipe nilai nullable adalah tipe nilai , bukan tipe referensi , jadi jangan berharap mereka memiliki semantik referensi kecuali mereka dikotakkan ke tipe referensi. Tidak ada tambahan tinju.sumber
Pernyataan ini berarti
null++
yaitu null + 1.Sesuai dengan dokumen ini, Jenis nullable dapat mewakili rentang nilai yang benar untuk jenis nilai dasarnya, ditambah nilai null tambahan. Nullable, diucapkan "Nullable of Int32", dapat diberi nilai apa pun dari -2147483648 hingga 2147483647, atau dapat diberi nilai nol
Di sini Anda menambahkan nol, maka itu juga akan menjadi nilai nol bukan 0 atau bilangan bulat lainnya.
ketika Anda mencetak tipe nullable dengan nilai null mencetak kosong bukannya kesalahan karena Anda mencetak variabel yaitu nilai lokasi memori. yang mungkin nol atau bilangan bulat apa pun.
Tetapi ketika Anda mencoba untuk mencetak null menggunakan
Console.WriteLine(null)
, karena null bukanlah variabel, jadi tidak merujuk ke lokasi memori apa pun. Dan karena itu memberikan kesalahan"NullReferenceException"
.Dalam kasus ini, 2 akan masuk ke memori di lokasi sementara, dan penunjuk menunjuk ke lokasi memori tersebut untuk mencetak.
sumber