Masalah yang diamati di sini adalah kasus khusus dari masalah yang lebih umum, yaitu jumlah definisi berbeda tentang persamaan yang mungkin berguna setidaknya dalam beberapa keadaan melebihi jumlah sarana yang umumnya tersedia untuk mengungkapkannya. Masalah ini dalam beberapa kasus diperburuk oleh keyakinan yang tidak menguntungkan bahwa membingungkan untuk memiliki cara berbeda untuk menguji kesetaraan menghasilkan hasil yang berbeda, dan kebingungan seperti itu dapat dihindari dengan memiliki bentuk persamaan yang berbeda menghasilkan hasil yang sama bila memungkinkan.
Pada kenyataannya, penyebab mendasar dari kebingungan adalah kepercayaan yang salah arah bahwa berbagai bentuk pengujian kesetaraan dan ketidaksetaraan diharapkan dapat memberikan hasil yang sama, terlepas dari kenyataan bahwa semantik yang berbeda berguna dalam keadaan yang berbeda. Misalnya, dari sudut pandang aritmatika, sangat berguna untuk dapat memiliki Decimal
yang hanya berbeda dalam jumlah angka nol tertinggal yang dibandingkan sebagai sama. Begitu juga untuk double
nilai seperti nol positif dan nol negatif. Di sisi lain, dari sudut pandang caching atau interning, semantik semacam itu bisa mematikan. Misalkan, misalnya, seseorang memiliki suatu Dictionary<Decimal, String>
hal yang myDict[someDecimal]
seharusnya samasomeDecimal.ToString()
. Objek seperti itu akan tampak masuk akal jika ada banyakDecimal
nilai yang ingin diubah menjadi string dan diharapkan ada banyak duplikat. Sayangnya, jika digunakan caching seperti itu untuk mengubah 12,3 m dan 12,40 m, diikuti oleh 12,30 m dan 12,4 m, nilai terakhir akan menghasilkan "12.3", dan "12.4", bukan "12.30" dan "12.4".
Kembali ke masalah yang ada, ada lebih dari satu cara yang masuk akal untuk membandingkan objek nullable untuk persamaan. C # mengambil sudut pandang bahwa ==
operatornya harus mencerminkan perilakunya Equals
. VB.NET mengambil sudut pandang bahwa perilakunya harus mencerminkan beberapa bahasa lain, karena siapa pun yang menginginkan Equals
perilakunya dapat menggunakan Equals
. Dalam beberapa hal, solusi yang tepat adalah memiliki konstruksi "jika" tiga arah, dan mengharuskan jika ekspresi kondisional mengembalikan hasil bernilai tiga, kode harus menentukan apa yang harus terjadi dinull
kasus tersebut. Karena itu bukan pilihan untuk bahasa apa adanya, alternatif terbaik berikutnya adalah mempelajari cara kerja bahasa yang berbeda dan mengenali bahwa keduanya tidak sama.
Secara kebetulan, operator "Is" Visual Basic, yang kurang dalam C, dapat digunakan untuk menguji apakah objek nullable, sebenarnya, null. Meskipun orang mungkin secara wajar mempertanyakan apakah suatu if
pengujian harus menerima a Boolean?
, meminta operator pembanding normal mengembalikan Boolean?
daripada Boolean
saat dipanggil pada tipe nullable adalah fitur yang berguna. Kebetulan, di VB.NET, jika seseorang mencoba menggunakan operator persamaan daripada Is
, ia akan mendapat peringatan bahwa hasil perbandingan akan selaluNothing
, dan seseorang harus menggunakan Is
jika ingin menguji apakah ada sesuatu yang nol.