Проверка на равенство 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

0 ответов

Другие вопросы по тегам