无法将 Dictionary<string、List> 转换为 IReadOnlyDictionary<string><string、IReadOnlyCollectio



谁能解释一下这个问题?

Dictionary<string, List<string>> x
= new Dictionary<string, List<string>>();
IReadOnlyDictionary<string, IReadOnlyCollection<string>> y 
= new Dictionary<string, IReadOnlyCollection<string>>();
y = x;  // CS0266: Cannot implicitly convert type...

你可以这样接近你的目标:

Dictionary<string, List<string>> x = new Dictionary<string, List<string>>()
{
{ "Foo", new List<string> {"A", "B", "C"} }
};
IReadOnlyDictionary<string, ReadOnlyCollection<string>> y = 
new ReadOnlyDictionary<string, ReadOnlyCollection<string>>(x.ToDictionary(k => k.Key, v => new ReadOnlyCollection<string>(v.Value)));

IReadOnlyCollection<string> foo = y["Foo"];

注意,ReadOnlyCollection<T>包装了原始列表。它不复制元素。ReadOnlyDictionary<TKey, TValue>也一样。

IReadOnlyDictionary对其值不协变。这是为了在TryGetValue方法周围提供类型安全。

考虑这个例子:

Dictionary<string, List<string>> x = new Dictionary<string, List<string>>
{
{ "Key", new List<string>() }
};
IReadOnlyDictionary<string, IReadOnlyCollection<string>> y = new Dictionary<string, IReadOnlyCollection<string>>
{
{ "Key", new System.ArraySegment<string>() } //This is allowed because an ArraySegment implements IReadOnlyCollection<string>
};
List<string> foo;
x.TryGetValue("Key", out foo);
foo.Add("Some string");

最后三行适用于x,因为它的值是List<string>。如果将y分配给x,它将不起作用,因为它的值不是List<string>,并且您不能在其上调用Add。这行不通:

y.TryGetValue("Key", out foo); //Error

也不会:

x = y;
x.TryGetValue("Key", out foo); //Error

因为它适用于x而不适用y,它们不是类型兼容的,所以不允许强制转换。

这篇文章完美地描述了您在代码中遇到的情况。

点击😀

Dictionary

相关内容

  • 没有找到相关文章

最新更新