2017-01-30 2 views
8

У меня есть struct под названием MyType, который реализует IEquatable<MyType>.Должен ли я переопределить == для объекта и MyType?

Я внедрил operator ==(MyType x, MyType y), но должен ли я также использовать operator ==(MyType x, object y) для корпуса ниже?

Например:

public static bool operator ==(MyType x, object y) 
{ 
    if (y is MyType) 
    { 
     return x == (MyType)y; 
    } 

    return false; 
} 

Использование:

var a = new MyType(); 
object b = new MyType(); 

var result = (a == b); // ? 
+0

Не могли бы вы привести пример использования этого оператора? – HimBromBeere

+0

@HimBromBeere добавлено – sdgfsdh

+2

@HimBromBeere - не было бы 'as' cast никогда не возвращать' null', потому что его 'struct'? – Igor

ответ

1

Отсутствует тип CTS делает это, насколько я знаю. Хорошие примеры включают Десятичные и DateTime, которые реализуют равенство только для своих типов, а не для их базовых типов или интерфейсов.

Кроме того, эта реализация может стимулировать сравнения практически любой типа с вашей структурой, даже другие структуры, а кто-то, кто мог бы использовать свой код в будущем может думать, сравнивая MyType с MyOtherType может иметь смысл, в то время как все это будет do - это бокс другого типа, а затем возврат false. Также обычно интерпретируется == на object как означающее ссылочное равенство.

Кроме того, вы должны перегрузить op_Equality и op_Inequality операторы. Это гарантирует, что все тесты для равенства возвращают согласованные результаты.

The documentation не сказать, какие операторы равенства следует перегружать, а второе предложение может фактически быть интерпретированы в терминах MyType == object быть в соответствии с MyType.Equals(object). Однако тот факт, что никакие типы .NET на самом деле не делают этого и что приводит к путанице, достаточно, чтобы сказать, что это не очень хорошая практика.

Если другие типы можно рассматривать как MyType, перегрузите явный или неявный литой.

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