提供されているジェネリック型パラメータに基づいて具体的な実装インスタンスを提供する単純なファクトリメソッドがあります。具象クラスがタイプパラメータを持つ共通の抽象基底クラスから継承している場合、それらをキャストすることはできません。コンパイラは私に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()
でコンパイルできません。これはコンパイラの欠陥か、抽象クラスとインタフェースを型パラメータと違ったやり方で扱う意図的な設計上の決定でしょうか?
回避策として、私はいつも抽象クラスにインターフェイスを実装させ、これをファクトリメソッドの戻り値として使用することができますが、なぜこの動作が起こっているのかを知りたいと思います。汎用コードがあらゆる可能T
のために(同じILで)作業する必要があり、何も言うことがないので、証明可能ない
これは私が使用した解決方法です。私にインターフェイス/代理人の違いについて思い出させてくれてありがとう - 感謝し、私の質問に答えます。 – dahvyd
私に思い出させていただきありがとうございます。あなたがドアの外にあるコードを手に入れなければならない時を忘れるのはずっと簡単です –