Как проверить на ноль в операторе == метод? - PullRequest
22 голосов
/ 29 декабря 2010

Рассмотрим следующий класс:

public class Code : IEquatable<Code> 
{
    public string Value { get; set; }

    public override bool Equals(object obj)
    {
         return Equals(obj as Code);
    }

    public override bool Equals(Code code)
    {
         if (code == null) return false;
         return this.Value == code.Value;
    }

    public static bool operator ==(Code a, Code b)
    {
         if (a == null) return b == null;
         return a.Equals(b);
    }

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

    // rest of the class here
}

Теперь попробуйте использовать метод ==:

Code a = new Code();
Code b = new Code();
Console.WriteLine("The same? {0}", a==b);

В результате получается StackOverflowException, потому что метод == вызывает сам себякогда он проверяет на ноль.

Но если я уберу проверку на ноль:

public static bool operator ==(Code a, Code b)
{
    return a.Equals(b);
}

Я получу NullReferenceException!

Как правильно определить этиметоды?

Ответы [ 3 ]

32 голосов
/ 29 декабря 2010

Вы также можете использовать (object)a == null

22 голосов
/ 29 декабря 2010

использование System.Object.ReferenceEquals(a, null)

0 голосов
/ 11 марта 2019

Начиная с C # 7, вы можете просто использовать ключевое слово is для прямого сравнения ссылок. См. ответ Торкила на В чем разница между «x is null» и «x == null»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...