Я создал пользовательский класс abstract, который, в свою очередь, конечно же, также создал производные классы.
public abstract class AbstractBaseClass
...
public class ChildClass1 : AbstractBaseClass
...
Теперь всякий раз, когда я объявляю, например, AbstractBaseClass baseClass = null
и везде, где после этой инициализации следуют нулевые проверки, она всегда терпит неудачу.
if (baseClass == null)
{
// this block is never reached - condition always evaluates to false
// let's say AbstractBaseClass baseClass = null is at line 10
// even if this condition is at line 11, condition still fails
}
Причина, по которой существует нулевая проверка, заключается в том, что существует несколько производных классов, и в каком-то процессе я определяю, какой это будет тип (например, с помощью случаев переключения). И, конечно, есть недопустимые случаи, в которых я ожидаю, что значение будет инициализированным null.
Это действительно странно, и я действительно ожидаю, что нулевая проверка будет оценена как истинная.
Каковы возможные причины, почему это происходит (чтобы я мог добавить больше примеров кода в зависимости от информации, так как весь соответствующий код довольно большой), и как это исправить? Спасибо.
ИЗМЕНИТЬ:
Кроме того, значение отладчика равно null.
О, правильно, как упомянул @taffer, == перегружен для AbstractBaseClass
. Вот эта часть и другой соответствующий код:
protected bool Equals(AbstractBaseClass other)
{
return Equals(this.SomeUniqueProperty, other.SomeUniqueProperty);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
return obj.GetType() == this.GetType() && this.Equals((AbstractBaseClass)obj);
}
public override int GetHashCode()
{
return (this.SomeUniqueProperty != null ? this.SomeUniqueProperty.GetHashCode() : 0);
}
public static bool operator ==(AbstractBaseClass a, AbstractBaseClass b)
{
if (ReferenceEquals(null, a))
{
return false;
}
return !ReferenceEquals(null, b) && a.Equals(b);
}
public static bool operator !=(AbstractBaseClass a, AbstractBaseClass b)
{
return !(a == b);
}
baseclass
? - person Denis Schaf   schedule 19.03.2019==
таким неинтуитивным способом? Абстракции, такие как перегрузка операторов, могут использоваться для того, чтобы сделать код кратким и элегантным, но это явный пример того, как можно выстрелить себе в ногу. - person dumetrulo   schedule 19.03.2019