C # derleyicisi, özel bir tür operatörü tanımladığında ==
, bunu tanımlaması gerektiğini de gerektirir !=
( buraya bakın ).
Neden?
Tasarımcıların neden gerekli olduğunu düşündüklerini merak ediyorum ve derleyici neden sadece diğeri mevcut olduğunda operatörlerden herhangi biri için makul bir uygulamaya geçemiyor. Örneğin, Lua sadece eşitlik operatörünü tanımlamanızı sağlar ve diğerini bedavaya alırsınız. C # aynı şeyi == ya da hem == ve! = Tanımlamanızı ve ardından otomatik olarak eksik! = İşlecini derlemenizi isteyebilir !(left == right)
.
Bazı varlıkların eşit veya eşit olmayan (IEEE-754 NaN'ler gibi) olabileceği garip köşe vakaları olduğunu anlıyorum, ancak bunlar kural değil istisna gibi görünüyor. Yani bu, C # derleyici tasarımcılarının istisnayı neden kural haline getirdiğini açıklamıyor.
Eşitlik operatörünün tanımlandığı zayıf işçilik vakaları gördüm, o zaman eşitsizlik operatörü, her karşılaştırmanın tersine çevrildiği ve her && bir || (noktayı anlıyorsunuz ... temel olarak! (a == b) De Morgan'ın kuralları ile genişledi). Bu, derleyicinin Lua'da olduğu gibi tasarımla ortadan kaldırabileceği zayıf bir uygulamadır.
Not: Aynısı <> <=> = operatörleri için de geçerlidir. Bunları doğal olmayan yollarla tanımlamanız gereken vakaları hayal edemiyorum. Lua sadece <ve <= tanımlamanıza ve> = ve> doğal olarak şekillendiricilerin olumsuzlaması yoluyla tanımlamanıza izin verir. Neden C # aynı şeyi yapmıyor (en azından 'varsayılan olarak')?
DÜZENLE
Görünüşe göre programcının istedikleri gibi eşitlik ve eşitsizlik kontrolleri yapmasına izin vermek için geçerli nedenler var. Cevapların bazıları bunun güzel olabileceği durumlara işaret ediyor.
Ancak sorumun çekirdeği, bu genellikle mantıksal olarak gerekli olmadığında neden C # 'da zorla gerekli?
Bu NET arayüzleri benzeri için seçimler tasarlamak için çarpıcı aksine aynı zamanda Object.Equals
, IEquatable.Equals
IEqualityComparer.Equals
bir eksikliği nerede NotEquals
çerçevesi düşündüğü muadili gösterileri !Equals()
eşitsiz olarak nesneleri ve bu. Ayrıca, sınıflar Dictionary
ve benzeri yöntemler .Contains()
sadece yukarıda bahsedilen arayüzlere bağlıdır ve tanımlanmış olsalar da operatörleri doğrudan kullanmazlar. ReSharper eşitlik üyelerini oluşturur Aslında, her iki tanımlar ==
ve !=
bakımından Equals()
o zaman bile kullanıcı seçer hiç operatörleri üretmek için yalnızca ve. Eşitlik operatörlerine nesne eşitliğini anlamak için çerçeve gerekmemektedir.
Temel olarak, .NET çerçevesi bu operatörleri umursamıyor, sadece birkaç Equals
yöntemi önemsiyor . == ve! = İşleçlerinin kullanıcı tarafından birlikte tanımlanmasını isteme kararı, .NET ile ilgili olarak nesne semantiği ile değil, yalnızca dil tasarımıyla ilgilidir.