0

私は持っている:

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

(説明のためだけに、それはインスタンス化され、値を持っています - 別の場所)

なぜ私はこれを行うことができます: ?

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 を返すことを除いて、キャストと同じです。問題は、インターフェイスから型にキャストできない理由です。そもそも保存方法を変更する以外に解決策はありますか?

4

2 に答える 2

2

再キャストできるのは、ジェネリックパラメーターではなく、最も外側のインターフェイス/クラス名のみです。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>;

2番目のケースでも同じことが起こります。実際にはではない種類のを追加するIDictionaryと、爆発する可能性があります。値はありません。ルーロー!OldDic1Dictionarydic1Dictionary

したがって、コンテナがある場合は、それぞれが同一である限り、前後にIList<X>変更できます。List<X>X

于 2009-06-30T15:53:24.437 に答える
0

この動作は、C#のasキーワードに関連しています。辞書は辞書と同じものではありません。

逆の方法でキャストした場合は、共変性と反変性のサポートが強化された次のバージョンの.NETで動作させることができる場合があります。

具体的なディクショナリ/リストにキャストする必要がある理由を特定し、必要な場合は、タイプのストレージを変更する必要がある場合の解決策。

于 2009-06-30T15:51:50.133 に答える