提供されたジェネリック型パラメーターに基づいて具体的な実装インスタンスを提供する単純なファクトリ メソッドがあります。具象クラスが型パラメーターを持つ共通の抽象基本クラスから継承する場合、それらをキャストできません。コンパイラが教えてくれ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()
。これはコンパイラの欠陥ですか?それとも、抽象クラスと型パラメータを持つインターフェイスを異なる方法で扱うための意図的な設計上の決定でしょうか?
回避策として、抽象クラスにインターフェイスを実装させ、これをファクトリ メソッドの戻り値として使用することはできますが、それでもこの動作が発生する理由を知りたいです。