2016-06-22 3 views
1

Я отладки вопрос в течение достаточно долгого времени, и понимают, что это исходит от использования в == на объекте, где я должен был использовать object.Equals()Переопределение операторов равенства с Equals()

Для того, чтобы предотвратить такую ​​проблему, хотел бы, чтобы оператор == вызывал Object.Equals(), который я переопределил.

Возможно ли это? Следующий код содержит исключение переполнения стека ...

public static bool operator ==(Portfolio a, Portfolio b) 
{ 
    return a != null && a.Equals(b); 
} 

public static bool operator !=(Portfolio a, Portfolio b) 
{ 
    return a != null && !a.Equals(b); 
} 

Спасибо!

+0

И как выглядит ваш 'Equals'? –

ответ

6

Вы рекурсивно называете оператора != оператором !=, следовательно, переполнение стека. Используйте ReferenceEquals вместо:

public static bool operator !=(Portfolio a, Portfolio b) 
{ 
    return !object.ReferenceEquals(a, null) && !a.Equals(b); 
} 

Тем не менее, этот код является ошибочным, так как он будет возвращать false если a является недействительным и b нет. Вы должны проверить оба объекта на нуль:

public static bool operator !=(Portfolio a, Portfolio b) 
{ 
    if (object.ReferenceEquals(a, null)) 
    { 
     return !object.ReferenceEquals(b, null); 
    } 

    return !a.Equals(b); 
} 
+0

Обычно я хотел бы сделать один 'private/protected static bool Equals ([type] a, [type] b) {if (ReferenceEquals (a, b)) {return true; } if (ReferenceEquals (a, null) || ReferenceEquals (b, null)) {return false; }/* логическое знание a и b не NullReferences * /} ', а затем' public override bool Equals (object obj) {return Equals (this, obj as [type]); } 'и' public static bool operator == ([type] a, [type] b) {return Equals (a, b); } 'и' public static bool operator! = ([type] a, [type] b) {return! Equals (a, b); } ' – Corak

+0

И если тип должен быть сопоставим, я использую этот подход: https://ericlippert.com/2013/10/07/math-from-scratch-part-six-comparisons/ – Corak

+0

Привет. Благодаря! На самом деле придумал одно и то же решение в то же время :) – goul