Для устройств Redmi и Mi отключить оптимизацию MIUI
Настройки> Дополнительные настройки> Параметры разработчика> Оптимизация MIUI
@neouser99: это - правильное решение, однако часть, которая пропущена, - то, что при переопределении оператора равенства (оператор ==) Вы должен также переопределить, Равняется функции, и просто сделайте вызов оператора функцией. Не все языки.NET поддерживают перегрузку оператора, следовательно причина переопределения Равняется функции.
Поскольку Microsoft заявляет,
Распространенная ошибка в перегрузках оператора == состоит в том, чтобы использовать (== b), (== пустой указатель), или (b == пустой указатель) для проверки на ссылочное равенство. Это вместо этого приводит к вызову к перегруженному оператору ==, вызывая бесконечный цикл. Используйте ReferenceEquals или бросьте тип, чтобы Возразить, избежать цикла.
Так используйте ReferenceEquals (a, пустой указатель) ||, ReferenceEquals (b, пустой указатель) является одной возможностью, но бросающий для возражения так же, как хороший (на самом деле эквивалентно, я верю).
Таким образом да, кажется, что должен быть лучший путь, но метод, который Вы используете, является рекомендуемым тем.
Однако, как был указан, действительно НЕОБХОДИМО переопределить, Равняется также при переопределении ==. Причем поставщики LINQ записаны на различных языках и делающий разрешение выражения во времени выполнения, кто знает, когда Вы будете битом, не делая его даже при владении всем кодом сами.
Просто используйте Resharper для создания Вас методы Equals & GetHashCode. Это создает самый всесторонний код с этой целью.
Обновление я не отправил его нарочно - я предпочитаю, чтобы люди использовали функцию Resharper вместо вставки копии, потому что код изменяется от класса до класса. Что касается разработки C# без Resharper - я не понимаю, как Вы живете, друг.
Так или иначе вот код для простого класса (Сгенерированный Resharper 3.0, более старой версией - я имею 4.0 на работе, я в настоящее время не помню, создает ли это идентичный код),
public class Foo : IEquatable<Foo>
{
public static bool operator !=(Foo foo1, Foo foo2)
{
return !Equals(foo1, foo2);
}
public static bool operator ==(Foo foo1, Foo foo2)
{
return Equals(foo1, foo2);
}
public bool Equals(Foo foo)
{
if (foo == null) return false;
return y == foo.y && x == foo.x;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(this, obj)) return true;
return Equals(obj as Foo);
}
public override int GetHashCode()
{
return y + 29*x;
}
private int y;
private int x;
}
if ((object)uq1 == null)
return ((object)uq2 == null)
else if ((object)uq2 == null)
return false;
else
//return normal comparison
Это сравнивает их как равных, когда оба являются пустыми.
Следуйте за обработкой DB:
null == <anything> is always false
Но почему Вы не создаете функцию элемента объекта? Это нельзя, конечно, назвать на Нулевой ссылке, таким образом, Вы уверены, что первый аргумент не является Нулевым.
Действительно, Вы теряете symmetricity бинарного оператора, но все еще...
(примечание по ответу Purfideas: Пустой указатель мог бы равняться Пустому указателю в случае необходимости как значению сигнальной метки массива),
Также думайте о семантике о Вашем == функция: иногда Вы действительно хотите смочь выбрать, тестируете ли Вы на