2015-05-13 6 views
8

В следующем фрагменте C# я переопределяю метод ==. _type - это номер типа short. Поэтому я на самом деле говорю, что два WorkUnitType s такие же, когда эти два short s одинаковы.Проверить значение null in == override

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (type1 == null || type2 == null) 
     return false; 
    return type1._type == type2._type; 
} 

Поскольку R # предупреждает меня, и это совершенно понятно, почему, что type1/type2 потенциально может быть пустым, я пытаюсь поймать, что с if заявлением выше.

Теперь я получаю StackOverflowException, что имеет смысл, потому что я на самом деле вызываю переопределение.

Вопрос: Как написать этот метод «правильно». Как я могу поймать дело, что type1 или type2 может быть null?

Моя догадка: Может быть, я просто злоупотребляет == здесь и проверка равенства должно быть сделано с Equals переопределения. Но все же я думаю, что проблема существует. Итак, где моя ошибка в рассуждении?

ответ

9

Вы ищете функцию ReferenceEquals(), которая будет сравнивать напрямую, минуя перегрузку вашего оператора.

+0

Я не знал, что 'ReferenceEquals' существует. На самом деле это ответ. Благодарю. – Stephan

2

В дополнение к тому, что сказал SLaks, вы, вероятно, также захотите вернуть значение true, если оба значения равны нулю. Так, например:

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (ReferenceEquals(type1, null)) 
     return ReferenceEquals(type2, null); 

    if (ReferenceEquals(type2, null)) 
     return false; 

    return type1._type == type2._type; 
} 
1

Для полноты: вы можете также отливать два аргумента object. Это будет использовать реализацию, определенную в object, а не вашу обычную.

В коде:

if ((object) type1 == null || (object) type2 == null) 
Смежные вопросы