2

.NET 4 ライブラリ (ここでは Mono で実行) にこの内部メソッドがある場合:

protected internal IEnumerable<KSComponent> GetComponentsByType(Type componentType)
{
    return this.componentsDic [componentType];
}

そして、簡単に使用できるように汎用パラメーターで公開したいと思います。これは私がこれまでに行ったことであり、何が機能していますか:

public IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
{
    return this.GetComponentsByType (typeof(TComponentType)).Cast<TComponentType>();
}    

ただし、.NET 4.0 ではこれも機能しないはずです。

public IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
    {
        return (IEnumerable<TComponentType>)this.GetComponentsByType (typeof(TComponentType));
    }

編集:

KSComponentは基本クラスであり、TComponentType(eg)KSMoveComponentであり、サブクラスKSComponentです。私が持っている状況は、上記のコードの元のクラスがKSComponent特定のタイプのリストを保持しているということです。たとえば、次のようになります。

typeof(KSMoveComponent)にマップしますList<KSComponent>()。リストのすべての要素は、実際には型KSMoveComponentです。したがって、拡張機能を使用する代わりに、これを直接List<KSComponent>キャストしたいと思います。List<KSMoveComponent>Linq.Cast()

質問に行き着きます: 私は車のリストを持っており、それらがすべてメルセデスであることを 100% 確信できます。では、なぜメルセデスのリストを取得できないのでしょうか? :-)

4

1 に答える 1

1

Covariance を使用すると、enumable をより一般的なバージョンにキャストできます。

一方、ジェネリック条件を使用すると、ジェネリック型をより制限的なものに置き換えることができます。

では、なぜそれが機能するのでしょうか。それらの 2 つが 2 つの異なる方向に進んでいるように見えます - 違いますか?

于 2013-02-15T21:57:17.120 に答える