Операторы перегружены , а не переопределены - другими словами, выбор используемой реализации делается во время времени компиляции . Компилятору известно только о T
как DataType
, поэтому он вызывает оператор в DataType
.
Один из вариантов - удалить оператор из MyBool
, но добавить в DataType
виртуальный метод, допускающий полиморфное поведение:
public class DataType
{
public static explicit operator bool(DataType D)
{
// TODO: Decide how you want to handle null references
return D.ToBoolean();
}
protected virtual bool ToBoolean()
{
return false;
}
}
public class MyBool : DataType
{
// ...
protected override bool ToBoolean()
{
return Value;
}
}
Обратите внимание, что этот не будет работать для преобразования из bool
в DataType
, так как в этом случае у нас нет никакой информации о том, какой подтип DataType
вы действительно хотите создать.
(Примечание: ваш код будет легче следовать, если вы будете использовать обычные соглашения об именах .NET).