Если можно добраться до журнала на экране, можно поразить Ctrl+Alt+F2 - это приносит Вам к терминалу, входят в систему подсказка. Войдите в систему со своим именем пользователя и паролем. Затем введите:
unity --reset
, Надо надеяться, это сбрасывает Ваш интерфейс правильно, и у Вас будут свои меню назад. К сожалению, это, вероятно, сбросит все Ваши настройки Compiz для установки по умолчанию. Однако у Вас должен быть свой интерфейс назад.
Проблема в том, что вы скрываете Equals, а не переопределяете его. Отлично - ваш модульный тест обнаружил ошибку :)
Ваш код должен быть:
public override bool Equals(object obj)
{
Money money = obj as Money;
if (money == null)
return false;
return (amount == money.amount && currency == money.currency);
}
(Это предотвратит создание исключения, если вы укажете ему неправильный тип.)
Я сделал проверка на равенство строк тоже проще - перегрузка операторов может быть очень полезной :)
Кстати, вы почти наверняка захотите:
Валюту
как свойство, а не метод Amount
amount
на decimal
вместо int
Times
РЕДАКТИРОВАТЬ: Я только что перечитал что вы используете пример из книги. Неужели книга действительно скрывает метод Equals
, а не отменяет его? Я предлагаю вам купить новую книгу, если так (если это не преднамеренный пример того, когда неправильно использовать сокрытие!) ... какая это книга?
Я подозреваю, что ваша проблема в том, что вы не переопределили перегрузку оператора равенства ==. Под капотом Assert.AreEqual, вероятно, используется ==.
См. Учебное пособие по перегрузке операторов .
Обновление: я провел тест NUnit через отладчик, и он действительно использует метод Equals, а не оператор ==.
Меня сбивает с толку то, что реализация интерфейса IEquatable, который также имеет метод
Equals(T other)
, поставила передо мной ту же проблему, что и описанная выше.
Единственная причина, по которой я решил использовать интерфейс IEquaytable выше, переопределяя метод Equals, заключалась в том, что мне не нужно было выполнять проверку типа.
В конце концов, мне пришлось использовать следующий код
public bool Equals(CustomTag other)
{
return (other.Name.Trim().ToLower() == Name.Trim().ToLower());
}
public override bool Equals(object o)
{
if (o is CustomTag)
{
return Equals(o as CustomTag);
}
return false;
}
, но потом я подумал, почему бы просто не оставить интерфейс IEquatable таким, какой он есть, и только переопределить метод Equals. (меньше кода = лучше)