ジェネリックスと共分散に関する興味深い問題が発生しました。長いストーリーは短いので、私があきらめるまでタイプを宣言しようと30分を要しました。C#共変動パズル、私は遭遇しました
わかりやすく:私はすでにこの問題の回避策を持っており、現在私のプロジェクトには助けが必要ありません。私は不思議な複雑なジェネリック型のファンなので、この質問をしました。あなたもそうなら、お楽しみください。
のすべてのオブジェクトをIDで管理するグローバルIDictionary
をフェッチするために、このメソッドを定義しようとしていました。 (IDは同じタイプのオブジェクト間で一意です)。
IDictionary<int, T> getCache<T>() where T : BaseClass { }
が
BaseClass
の全ての誘導体について
T
をチェックしないようにするには、私は正しいリストをルックアップするために、辞書のグローバル辞書を定義したい(その多くがあります)。
私はこのような何かを試してみました:ジェネリック医薬品の
Dictionary<Type, IDictionary<int, Baseclass>> allCaches;
Expieriencedユーザーがこの実装に問題が表示される場合がありますIDictionary<TKey, TValue>
インタフェースは共変ではありません。
(未共変手段、IDictionary<int, DerivedClass>
がIDictionary<int, BaseClass>
から継承されません。その結果、前者のタイプのオブジェクトは、私の辞書allCaches
に配置することはできません)
私は、ちょうどすべての私のキャッシュのためIDictionary<int, BaseClass>
を使用して、終わりました私がそれらを読むとき、記憶された要素を手動でキャストバックする。
最小のキャスティングを使用し、BaseClass
から派生したすべてのタイプに対して手動で分岐しない、私のメソッドgetCache<T>()
の実装について誰も考えることができますか?
キャストせずにこれを行うには依存型が必要だと思います。 – Lee