Проверка на равенство C# для универсальной оболочки с неявным приведением не работает для классов
Итак, у меня есть универсальный класс-оболочка с неявным приведением типа этого:
public class Wrapper<T>
{
T _value;
public Wrapper(T val)
{
_value = val;
}
static public implicit operator T(Wrapper<T> wrapper)
{
return wrapper._value;
}
// ... other functionality
}
Когда я использую это для int, я могу использовать ==
проверить на равенство. Однако, когда я использую это, чтобы обернуть класс, я не могу:
public static void Main()
{
int normalInt = 3;
var wrappedInt = new Wrapper<int>(3);
Console.WriteLine(wrappedInt == normalInt);
SomeClass normalClass = new SomeClass();
var wrappedClass = new Wrapper<SomeClass>(new SomeClass());
Console.WriteLine(wrappedClass == normalClass); // implicit cast gives compile error
Console.WriteLine((SomeClass)wrappedClass == normalClass); // explicit cast does work
}
Я получаю ошибку компиляции (с неявным приведением):
Operator '==' cannot be applied to operands of type 'Wrapper<SomeClass>' and 'SomeClass'
Однако, когда я явно приведу это, он работает...
Почему это происходит? И как я могу это исправить, чтобы явное приведение не требовалось?
Минимальный рабочий пример: https://dotnetfiddle.net/OZv9jI