У меня есть простой фабричный метод, который предоставляет конкретный экземпляр реализации на основе предоставленного параметра универсального типа. Если конкретные классы наследуются от общего абстрактного базового класса с параметром типа, я не могу их преобразовать. Компилятор говорит мне 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()
. Является ли это дефектом компилятора или это может быть преднамеренное дизайнерское решение по-разному обрабатывать абстрактные классы и интерфейсы с параметрами типа?
В качестве обходного пути я всегда могу заставить абстрактный класс реализовать интерфейс и использовать его в качестве возвращаемого значения для моего фабричного метода, но мне все же хотелось бы знать, почему происходит такое поведение.