Как проверить наличие нулей в перегрузке оператора '==' без бесконечной рекурсии? - PullRequest
105 голосов
/ 16 сентября 2008

Следующее вызовет бесконечную рекурсию для метода перегрузки оператора ==

    Foo foo1 = null;
    Foo foo2 = new Foo();
    Assert.IsFalse(foo1 == foo2);

    public static bool operator ==(Foo foo1, Foo foo2) {
        if (foo1 == null) return foo2 == null;
        return foo1.Equals(foo2);
    }

Как проверить наличие нулей?

Ответы [ 12 ]

0 голосов
/ 18 октября 2016

Распространенной ошибкой в ​​перегрузках оператора == является использование (a == b), (a ==null) или (b == null) для проверки на равенство ссылок. Это вместо приводит к вызову перегруженного оператора ==, вызывая infinite loop. Используйте ReferenceEquals или приведите тип к объекту, чтобы избежать цикл.

проверить это

// If both are null, or both are same instance, return true.
if (System.Object.ReferenceEquals(a, b))// using ReferenceEquals
{
    return true;
}

// If one is null, but not both, return false.
if (((object)a == null) || ((object)b == null))// using casting the type to Object
{
    return false;
}

ссылка Рекомендации по перегрузке Equals () и оператора ==

0 голосов
/ 16 сентября 2008

Вы можете попытаться использовать свойство объекта и перехватить полученное исключение NullReferenceException. Если свойство, которое вы пробуете, наследуется или переопределяется из Object, то это работает для любого класса.

public static bool operator ==(Foo foo1, Foo foo2)
{
    //  check if the left parameter is null
    bool LeftNull = false;
    try { Type temp = a_left.GetType(); }
    catch { LeftNull = true; }

    //  check if the right parameter is null
    bool RightNull = false;
    try { Type temp = a_right.GetType(); }
    catch { RightNull = true; }

    //  null checking results
    if (LeftNull && RightNull) return true;
    else if (LeftNull || RightNull) return false;
    else return foo1.field1 == foo2.field2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...