Разница между ==
и Equals
в том, что ==
(как и все операторы) не является полиморфной , а Equals
(как и любая виртуальная функция) -
По умолчанию ссылочные типы будут получать идентичные результаты для ==
и Equals
, потому что они оба сравнивают ссылки. Также возможно совершенно по-разному кодировать логику вашего оператора и Equals
, хотя это кажется бессмысленным. Самая большая проблема возникает при использовании оператора ==
(или любого другого) на более высоком уровне, чем объявлена требуемая логика (другими словами, ссылка на объект как родительский класс, который либо явно не определяет оператор, либо определяет его по-другому чем истинный класс). В таких случаях логика для класса, на который он ссылается , используется для операторов, но логика для Equals
исходит из любого класса, на самом деле объект является .
Я хочу категорически заявить, что, основываясь исключительно на информации в вашем вопросе, нет абсолютно никаких оснований думать или предполагать, что Equals
сравнивает значения со ссылками . Создать такой класс довольно просто, но это , а не спецификация языка.
Редактирование после вопроса
Ваша реализация Equals
вернет true для любого ненулевого экземпляра вашего класса . Хотя синтаксис заставляет меня думать, что это не так, вы можете путать ключевое слово is
C # (которое подтверждает тип) с ключевым словом is
в VB.NET (которое подтверждает ссылочное равенство). Если это действительно так, то вы можете сделать явное сравнение ссылок в C #, используя Object.ReferenceEquals(this, obj)
.
В любом случае, именно поэтому вы видите true
для Equals
, поскольку вы передаете ненулевой экземпляр вашего класса.
Кстати, ваш комментарий о NUnit с использованием Equals
верен по той же причине; поскольку операторы не являются полиморфными, у определенного класса не будет возможности определить пользовательское поведение равенства, если функция Assert
использует ==
.