Convert.ToString(null)
kembali
null
Seperti yang kuharapkan.
Tapi
Convert.ToString(null as object)
kembali
""
Mengapa ini berbeda?
Ada 2 kelebihan ToString
yang ikut bermain di sini
Convert.ToString(object o);
Convert.ToString(string s);
Kompiler C # pada dasarnya mencoba untuk memilih kelebihan beban paling spesifik yang akan bekerja dengan input. Sebuah null
nilai adalah konversi untuk semua jenis referensi. Dalam kasus string
ini lebih spesifik daripada object
dan oleh karena itu akan dipilih sebagai pemenang.
Di bagian null as object
Anda telah memperkuat jenis ekspresi sebagai object
. Ini berarti itu tidak lagi kompatibel dengan string
kelebihan beban dan kompilator mengambil object
kelebihan beban karena itu satu-satunya yang kompatibel yang tersisa.
Detail yang sangat detail tentang cara kerja pemutusan dasi ini tercakup dalam bagian 7.4.3 dari spesifikasi bahasa C #.
Convert.ToString(string)
itu hanya fungsi identitas sementaraConvert.ToString(object)
sebenarnya melalui jalur yang lebih sulit untuk diikuti. Sekilas saya setuju mereka harus mengembalikan yang sama tetapi lapisan convertible BCL bukanlah sesuatu yang sangat saya ketahui dan mungkin ada alasan bagus untuk perbedaan tersebut (meskipun saya skeptis)(string)null
, atau jika objek Anda disebut o, maka(string)o
Mengikuti dari jawaban resolusi kelebihan beban JaredPar yang sangat baik - pertanyaannya tetap "mengapa
Convert.ToString(string)
mengembalikan nol, tetapiConvert.ToString(object)
mengembalikanstring.Empty
"?Dan jawabannya adalah ... karena dokumen mengatakan demikian :
EDIT: Seperti apakah ini adalah "bug dalam spesifikasi", "desain API yang sangat buruk", "mengapa itu ditentukan seperti ini", dll. - Saya akan mencoba beberapa alasan mengapa saya tidak melihat itu masalah besar.
System.Convert
memiliki metode untuk mengubah setiap tipe dasar menjadi dirinya sendiri . Ini aneh - karena tidak diperlukan atau mungkin konversi, jadi metode ini hanya mengembalikan parameter.Convert.ToString(string)
berperilaku sama. Saya menganggap ini di sini untuk skenario pembuatan kode.Convert.ToString(object)
memiliki 3 pilihan saat lulusnull
. Lempar, kembalikan null, atau kembalikan string. Melempar akan berakibat buruk - jadi dua kali lipat dengan asumsi ini digunakan untuk kode yang dihasilkan. Mengembalikan null mengharuskan pemanggil Anda melakukan pemeriksaan null - sekali lagi, bukan pilihan yang bagus dalam kode yang dihasilkan. Returning string. Kekosongan tampaknya merupakan pilihan yang masuk akal. SisaSystem.Convert
penawaran dengan jenis nilai - yang memiliki nilai default.Convert.ToString(string)
berarti melanggar aturan "tidak ada konversi yang sebenarnya". KarenaSystem.Convert
merupakan kelas utilitas statis, setiap metode dapat diperlakukan secara logis sebagai miliknya sendiri. Ada sangat sedikit skenario dunia nyata di mana perilaku ini harus "mengejutkan", jadi biarkan kegunaan menang atas (kemungkinan) kebenaran.sumber