在一个用于内部可重复使用库的通用C#类中,我想传递一个“映射到其他事物列表的东西”的引用。传入的数据类型不应该被库知道。此外,它们存储的方式也不应该被知道,即今天保存在内存中的列表,可能会变成以后按需从数据库表中读取的内容。因此,我认为我应该编写这个库类:
我遇到了以下两个语法错误:
class GenericClass<T, U>
{
public void Foo(IDictionary<T, IEnumerable<U>> bar)
{
// do something
}
}
这段代码可以编译通过,但是尝试传入具体的实现时会出现问题:
class UsingClass
{
public static void Main(string[] args)
{
var c = new GenericClass<string, string>();
c.Foo(new Dictionary<string, List<string>>());
}
}
我遇到了以下两个语法错误:
Filename.cs(46,13): error CS1502: The best overloaded method match for 'GenericClass<string,string>.Foo(System.Collections.Generic.IDictionary<string,System.Collections.Generic.IEnumerable<string>>)' has some invalid arguments
Filename.cs(46,19): error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.Dictionary<string,System.Collections.Generic.List<string>>' to 'System.Collections.Generic.IDictionary<string,System.Collections.Generic.IEnumerable<string>>'
将 Foo()
声明中的 IEnumerable
替换为 List
可以解决问题,但这显然不是我想要的。
这真的不被 C# (4.0) 支持吗?还是我只是忽略了一些明显的东西?你会建议什么样的解决方法呢?(我相信这已经被广泛讨论过了,所以也可以提供链接到很好的描述。)
是的,我应该能够为此编写自己的辅助类,但为什么我必须这样做呢?
List<string>
,而函数只承诺IEnumerable<string>
。 - sirideDictionary<string,List<string>>
。该类型保证其值始终与List<string>
兼容。如果该方法尝试将错误类型的值放入该字典中,则确实应该在某种程度上失败,最好在编译时失败。或者您认为泛型集合内的类型安全性不重要吗?;) - Jon Skeet