我有一个方法,签名如下:
产生编译错误:
参数1:无法将“System.Collections.Generic.Dictionary>”转换为“System.Collections.Generic.IDictionary>”
Dictionary实现IDictionary,HashSet实现IEnumerable。
为什么编译器无法执行转换?
我如何创建一个数据实例,以便将其传递给Foo?
注意:
如果我更改签名为
编译成功。然而,我不需要知道传递的是像
更新:
以下代码可以编译:
public void Foo(IDictionary<string, IEnumerable<string>> data)
{
}
并希望传递
private Dictionary<string, HashSet<string>> myInput =
new Dictionary<string, HashSet<string>>()
{
};
这是一行文本。
Foo(myInput);
产生编译错误:
参数1:无法将“System.Collections.Generic.Dictionary>”转换为“System.Collections.Generic.IDictionary>”
Dictionary实现IDictionary,HashSet实现IEnumerable。
为什么编译器无法执行转换?
我如何创建一个数据实例,以便将其传递给Foo?
注意:
如果我更改签名为
public void Foo(IDictionary<string, HashSet<string>> data)
编译成功。然而,我不需要知道传递的是像
HashSet<T>
这样的具体类型。任何IEnumerable<T>
都可以。更新:
以下代码可以编译:
public void Foo(IDictionary<string, IEnumerable<string>> data)
{
List<string> item = new List<string>() { "foo", "bar", "baz" };
data.Add("key", item);
HashSet<string> item2 = new HashSet<string>() { "quu" };
data.Add("key2", item2);
}
很明显,data
可以接受各种类型的值,只要它们都实现了IEnumerable<T>
IDictionary<TKey, TValue>
接口上。它的类型参数都不是协变的,因此只能分配完全匹配该类型的内容。没有其他选择。 - Jesse C. Slicer