質問

い:

IDictionary<string, IDictionary<string, IList<long>>> OldDic1; 

(イラスト目的で、インスタンス化や価値観-else)

できないのはなぜでいます:?

Dictionary<string, IDictionary<string, IList<long>>> dic1 = 
  OldDic1 as Dictionary<string, IDictionary<string, IList<long>>>;

基本的にはdic1を実行した後、この線はすべての値からOldDic1;ます。

しかし私はこの:

Dictionary<string, Dictionary<string, List<long>>> dic1 = 
  OldDic1 as Dictionary<string, Dictionary<string, List<long>>>;

を取得しまnullの場合、ってはお入れすることができない鋳物を除くな衝突ではなくnullを返します。ではなぜできないキャストからのインタフェースのか。ある溶液、その他その変化にどのように格納されたのでしょうか。

役に立ちましたか?

解決

あなただけの最も外側のインタフェース/クラス名ではなく、一般的なパラメータを再キャストすることができます。 2番目のキャストが動作しない理由は、あなたが「含まれる」オブジェクトをキャストすることができても、別の配列型からキャストすることはできません同じ理由です。その理由は次のとおりです。

List<object> objects;
List<string> strings;

objects = strings as List<object>;
// Uh oh, that's not a string!
objects.Add(42); 

objects = new List<object> { "The", "answer", "is", 42 };
// Uh oh, now strings contains an integer?
strings = objects as List<string>;

同じことがあなたの第二の場合に起こるでしょう。あなたが実際にIDictionaryされていないOldDic1するDictionaryのいくつかの種類を追加することができ、その後、dic1は爆破でしょう。これは、非Dictionary値を持っているでしょう。 RUH盧!

あなたは、容器を持っているとき、

だから、あなたは限りIList<X>がそれぞれのための同じのあるとしてバックList<X>とするXから変更することができます。

他のヒント

の挙動に関する キーワード クライアントまで、フルのC#.辞書は同じものではありませんとしてIDictionary.

また鋳物のできる場合もありますが、いずれかで、次のバージョンです。純増の支援 共分散とcontravariance.

を解決するため なぜ に必要なキャストコンクリートの辞書リストの場合は、その後変更の保存の型です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top