Convert.ToString(null)
kembali
null
Seperti yang kuharapkan.
Tapi
Convert.ToString(null as object)
kembali
""
Mengapa ini berbeda?
Convert.ToString(null)
kembali
null
Seperti yang kuharapkan.
Tapi
Convert.ToString(null as object)
kembali
""
Mengapa ini berbeda?
Jawaban:
Ada 2 kelebihan ToStringyang 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 nullnilai adalah konversi untuk semua jenis referensi. Dalam kasus stringini lebih spesifik daripada objectdan oleh karena itu akan dipilih sebagai pemenang.
Di bagian null as objectAnda telah memperkuat jenis ekspresi sebagai object. Ini berarti itu tidak lagi kompatibel dengan stringkelebihan beban dan kompilator mengambil objectkelebihan 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 sementara Convert.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, tetapi Convert.ToString(object)mengembalikan string.Empty"?
Dan jawabannya adalah ... karena dokumen mengatakan demikian :
Convert.ToString (string) mengembalikan "contoh string yang ditentukan; tidak ada konversi aktual yang dilakukan."
Convert.ToString (object) mengembalikan "representasi string dari nilai, atau String.Empty jika nilainya null."
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.Convertmemiliki 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 lulus null. 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. Sisa System.Convertpenawaran dengan jenis nilai - yang memiliki nilai default.Convert.ToString(string)berarti melanggar aturan "tidak ada konversi yang sebenarnya". Karena System.Convertmerupakan 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.