Введение:
У меня есть несколько классов, которые выполняют одну и ту же работу, но с разными типами значений (например, векторы с плавающей запятой или целые числа).
Теперь я хочу иметь возможность проверять равенство , это равенство также должно работать между типами (например, 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 вместо этого, но такой подход является для меня серьезным ограничением.
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.
[...]
Вопрос:
Есть ли способ реализовать оператор == таким образом, чтобы он допускал простую нулевую проверку и допускал проверку равенства между различными векторами?
В качестве альтернативы, есть ли другой способ, как я мог бы / должен это реализовать?
null
не возникает. (Я предполагаю, что ваши классы содержат только 2 или 3 значения.) - person Matthew Watson   schedule 21.02.2017==
или== null
. Как насчет того, чтобы иметь методы для сравнения с вектором другого типа? Например.VectorF.IsSame(VectorI)
? Компилятор покажет ошибку пользователя, когда он попытаетсяvectorF == vectorI
, а затем пользователь будет искать методы для сравнения, тада, проблема решена? Еще один момент: сравнениеfloat
сint
не будет точным, как насчет того, чтобы сначала преобразоватьVectorF
вVectorI
, а затем сравнить дваVectorI
? - person Sinatr   schedule 21.02.2017