Невозможно преобразовать производный тип в базовый абстрактный класс с параметром типа

У меня есть простой фабричный метод, который предоставляет конкретный экземпляр реализации на основе предоставленного параметра универсального типа. Если конкретные классы наследуются от общего абстрактного базового класса с параметром типа, я не могу их преобразовать. Компилятор говорит мне Error 2 Cannot convert type 'Car' to 'VehicleBase<T>'. Он отлично работает, если я заменяю абстрактный класс интерфейсом с параметром того же типа или удаляю параметр универсального типа из абстрактного класса.

interface IWheel
{
}

class CarWheel : IWheel
{
}

abstract class VehicleBase<T>
{
}

class Car : VehicleBase<CarWheel>
{
}

class VehicleFactory
{
    public static VehicleBase<T> GetNew<T>()
    {
        if (typeof(T) == typeof(CarWheel))
        {
            return (VehicleBase<T>)new Car();
        }
        else
        {
            throw new NotSupportedException();
        }
    }
}

Это не скомпилируется на (VehicleBase<T>)new Car(). Является ли это дефектом компилятора или это может быть преднамеренное дизайнерское решение по-разному обрабатывать абстрактные классы и интерфейсы с параметрами типа?

В качестве обходного пути я всегда могу заставить абстрактный класс реализовать интерфейс и использовать его в качестве возвращаемого значения для моего фабричного метода, но мне все же хотелось бы знать, почему происходит такое поведение.

11
задан dahvyd 26 June 2012 в 06:26
поделиться