2014-10-15 5 views
3

У меня есть тип C#, для которого логический смысл сравнивать для равенства с int. Назовите этот тип Number.Должен ли я разрешать асимметричные равные?

Однако я не могу сделать Equals симметричным, потому что я не могу изменить Int32.Equals(object other). Таким образом, я должен разрешить асимметричное равенство, например:

Number numberThree = new Number(3); 
int intThree = 3; 

bool equal; 
equal = numberThree.Equals(intThree); // equal is true 
equal = intThree.Equals(numberThree); // equal is false 

Или я должен просто разрешить только равенство, если типы совпадают, а также числовое значение?

ответ

4

Нет, это нарушает договор Object.Equals:

Следующие заявления должны быть справедливо для всех реализаций метода Equals(Object). В списке x, y и z представляют ссылки на объекты, которые не являются нулевыми.

  • ...
  • x.Equals(y) возвращает то же значение, как y.Equals(x).

Все, что с помощью Equals должны быть в состоянии зависеть от того, что - так его нарушение может генерировать некоторые действительно странные эффекты. Представьте себе, что Dictionary<,>.ContainsKey называется key.Equals(candidateEntry.Key), но указатель под названием candidateEntry.Key.Equals(key) ... вы можете увидеть ключ как существующий, но не сможете получить запись ... или наоборот. Или, может быть, он будет работать в одной реализации Dictionary<,>, но не в последующей версии (или не в Mono и т. Д.).

+0

Привет, Джон, спасибо за ответ. Это настоящий позор, у C# нет встроенного Number, такого как Java. Но да, ваш пример словаря доказывает это. Хорошего дня. :) – Xenoprimate

+1

Однако вы можете переопределить оператор '==' просто отлично. Или используйте оператор неявного преобразования. С помощью любого из них вы можете гарантировать, что '(a == b) == (b == a)'. – Luaan

+0

@Motig: Даже если у .NET был тип «Number», это не устранило бы требование сделать его симметричным ... –

Смежные вопросы