Compiler C # mensyaratkan bahwa kapan pun tipe kustom mendefinisikan operator ==
, ia juga harus mendefinisikan !=
(lihat di sini ).
Mengapa?
Saya ingin tahu mengapa para perancang menganggap itu perlu dan mengapa kompiler tidak dapat melakukan default untuk implementasi yang masuk akal bagi salah satu operator ketika hanya yang lain yang hadir. Misalnya, Lua memungkinkan Anda menentukan hanya operator kesetaraan dan Anda mendapatkan yang lain secara gratis. C # dapat melakukan hal yang sama dengan meminta Anda untuk mendefinisikan == atau keduanya == dan! = Dan kemudian secara otomatis mengkompilasi operator yang hilang! = !(left == right)
.
Saya mengerti bahwa ada kasus sudut aneh di mana beberapa entitas mungkin tidak sama atau tidak sama, (seperti IEEE-754 NaN), tetapi itu tampak seperti pengecualian, bukan aturan. Jadi ini tidak menjelaskan mengapa desainer kompiler C # membuat pengecualian aturan.
Saya telah melihat kasus-kasus pengerjaan yang buruk di mana operator kesetaraan didefinisikan, maka operator ketidaksetaraan adalah copy-paste dengan masing-masing dan setiap perbandingan dibalik dan setiap && beralih ke || (Anda mendapatkan intinya ... pada dasarnya! (a == b) diperluas melalui aturan De Morgan). Itu praktik buruk yang bisa dihilangkan oleh kompiler dengan desain, seperti halnya dengan Lua.
Catatan: Hal yang sama berlaku untuk operator <> <=> =. Saya tidak bisa membayangkan kasus-kasus di mana Anda harus mendefinisikan ini dengan cara yang tidak wajar. Lua memungkinkan Anda mendefinisikan hanya <dan <= dan mendefinisikan> = dan> secara alami melalui negasi pembentuk. Mengapa C # tidak melakukan hal yang sama (setidaknya 'secara default')?
EDIT
Rupanya ada alasan yang sah untuk memungkinkan pemrogram menerapkan pemeriksaan untuk kesetaraan dan ketidaksetaraan sesuka mereka. Beberapa jawaban menunjuk pada kasus-kasus di mana itu mungkin menyenangkan.
Kernel pertanyaan saya, bagaimanapun, adalah mengapa ini secara paksa diperlukan dalam C # ketika biasanya itu tidak diperlukan secara logis ?
Ini juga sangat kontras dengan pilihan desain untuk antarmuka .NET seperti Object.Equals
, di IEquatable.Equals
IEqualityComparer.Equals
mana kurangnya NotEquals
mitra menunjukkan bahwa kerangka kerja menganggap !Equals()
objek tidak setara dan hanya itu. Selain itu, kelas suka Dictionary
dan metode suka .Contains()
bergantung secara eksklusif pada antarmuka yang disebutkan di atas dan tidak menggunakan operator secara langsung bahkan jika mereka didefinisikan. Bahkan, ketika ReSharper menghasilkan anggota kesetaraan, ia mendefinisikan keduanya ==
dan !=
dalam hal Equals()
dan bahkan kemudian hanya jika pengguna memilih untuk menghasilkan operator sama sekali. Operator kesetaraan tidak diperlukan oleh kerangka kerja untuk memahami kesetaraan objek.
Pada dasarnya, .NET framework tidak peduli dengan operator ini, ia hanya peduli pada beberapa Equals
metode. Keputusan untuk mengharuskan operator == dan! = Untuk didefinisikan secara bersamaan oleh pengguna terkait murni dengan desain bahasa dan bukan objek semantik sejauh menyangkut .NET.