Можете ли вы удовлетворить общее ограничение с помощью неявного преобразования?

Для этих типов:

class A { }
class B
{
    public static implicit operator A(B me)
    {
        return new A();
    }
}

class Test where T : A { }

Я попробовал

var b = new Test();

И ожидал, что это не удастся, что и произошло. Но сообщение об ошибке

Тип «B» нельзя использовать в качестве параметра типа «T» в универсальном типе или методе «Test». Неявного преобразования ссылки из «B» в «A» нет.

Но существует неявное преобразование ссылки из B в A. Это просто странное сообщение? Существует не неявное преобразование ссылки, как показывает ответ Адама Робинсона. Сообщение правильное.

Обратите внимание, что MSDN говорит:

где T: (имя базового класса) - аргумент типа должен быть или производным от указанного базового класса.

Это объясняет, почему это запрещено, поскольку B не является производным от A

6
задан default.kramer 17 November 2011 в 18:24
поделиться