Введения:
У меня есть несколько классов, которые делают ту же работу, но с разными типами значений (например, векторы поплавков или целыми).
Теперь я хочу иметь возможность проверить равенство, это равенство должно также работать между типами (такими как vectorF == vectorI).
Также должно быть возможно выполнить нулевую проверку (vectorF == null).C#, несколько операторов == Перегрузки без неоднозначных нулевой проверки
подход:
Мой подход заключается в создании нескольких перегруженных для == и = операторы, один для каждой возможной комбинации!.
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 или нулевую отливку вместо этого, но что approachis серьезного ограничения для меня.
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.
[...]
Вопрос:
Есть ли способ реализации оператора == таким образом, что позволяет простую проверку нулевой, и позволяет для проверки равенства между различными векторами?
В качестве альтернативы, существует ли другой способ, каким образом я мог/должен реализовать это?
Похоже, что ваши классы Vector действительно должны быть неизменяемыми структурами. Тогда вопрос «null» не возникает. (Я предполагаю, что ваши классы содержат только 2 или 3 значения.) –
Похоже на [zugzwang] (https://en.wikipedia.org/wiki/Zugzwang): либо красивый '==' или '== null '. Как насчет методов сравнения с вектором другого типа? Например. 'VectorF.IsSame (VectorI) '? Компилятор покажет ошибку пользователя, когда он попробует 'vectorF == vectorI', а затем пользователь будет искать методы для сравнения, tada, решить проблему? Другое дело: сравнение 'float' с' int' было бы неточным, как насчет того, чтобы вначале «VectorF» в «VectorI», а затем сравнивая два «VectorI»? – Sinatr
Почему вам нужны левые и правые перегрузки .. Могу ли вы поделиться с нами перегруженными методами. – levent