提问者:小点点

嵌套接口:将idictionary<tkey,iList<tvalue>>转换为idictionary<tkey,iEnumerable<tvalue>>?


我认为将IDictionary>对象强制转换为IDictionary>相当简单,但是

var val = (IDictionary<TKey, IEnumerable<TValue>>)Value;
var val = Value as IDictionary<TKey, IEnumerable<TValue>>;

共1个答案

匿名用户

我认为将IDictionary>对象强制转换为IDictionary>相当简单

绝对不行.它不会是类型安全的。这里有一个为什么不这样做的例子:

// This is fine...
IDictionary<string, IList<int>> dictionary = new Dictionary<string, IList<int>>();

// Suppose this were valid...
IDictionary<string, IEnumerable<int>> badDictionary = dictionary;

// LinkedList<T> doesn't implement IList<T>
badDictionary["foo"] = new LinkedList<int>();

// What should happen now?
IList<int> bang = dictionary["foo"];

正如您所看到的,这将导致问题-当我们期望所有值都实现ILIST时,我们将试图获得LinkedList。泛型的重点是类型安全-那么您希望哪一行会失败呢?在我看来,第一行、第三行和第四行显然是有效的--所以第二行是唯一一个无法编译的行,它确实...

编辑:只是为了澄清-很容易用现有键/值对的副本创建一个新字典,例如使用link:

var copy = original.ToDictionary<TKey, IEnumerable<TValue>>(pair => pair.Key,
                                                            pair => pair.Value);

你只需要知道你现在有两个独立的字典。