Введение:
У меня есть несколько классов, которые выполняют ту же работу, но с разными типами значений (например, векторы поплавков или целых чисел).
Теперь я хочу иметь возможность проверить равенство, это равенство должно также работать между типами (такими как vectorF == vectorI).
Кроме того, должно быть возможно выполнить нулевую проверку (vectorF == null).
Подход:
Мой подход заключается в создании нескольких перегрузок для операторов == и! =, По одному для каждой возможной комбинации.
public sealed class VectorF
{
[...]
public static bool operator == (VectorF left, VectorI right)
{
// Implementation...
}
public static bool operator == (VectorF left, VectorF right)
{
// Implementation...
}
// Same for != operator
[...]
}
Проблема:
Используя множественные перегрузки, я не могу просто выполнить нулевую проверку с помощью оператора ==, поскольку вызов будет неоднозначным.
var v = new VectorF([...]);
if (v == null) // This call is ambiguous
[...]
Я знаю о возможности использовать ReferenceEquals или null casting вместо этого, но этот подход является серьезным ограничением для меня.
var v = new VectorF([...]);
if(object.ReferenceEquals(v, null)) // Would work, is not user friendly.
[...]
if(v == (VectorF)null) // Would also work, is neither user friendly.
[...]
Вопрос:
Есть ли способ реализовать оператор == таким образом, что он позволяет простую проверку нуля и позволяет проверять равенство между разными векторами?
Альтернативно, есть ли другой способ, каким образом я мог/должен был это реализовать?