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