我只是想知道为什么把System.Collections.Generic.List<string>传递给这个函数test(ICollection<object> t)不起作用,为什么我不能像传递string一样传递给test2(object t)
对我来说没什么意义!
发布于 2010-08-06 13:17:59
因为ICollection不是一个只输出的接口,所以它不是协变的。
考虑下面的代码:
void test(ICollection<object> t)
{
t.Add(new TextBox());
}
List<string> lst;
test(lst);当test尝试将TextBox填充到List<string>中时,会发生什么情况
ICollection<object>的约定是可以放入任何object,并且输出的项将始终是object类型。但List<string>只满足了这一合同的一半。
发布于 2010-08-06 13:17:39
因为在C# 3.0和.NET 3.5或更早版本中,List<T>实现了ICollection<T>。这意味着List和ICollection的泛型类型必须相同。在这种情况下,尽管字符串是从object派生的,但无法将List<sting>赋值给List<object>。同样,不能将List<string>分配给ICollection<object>。
在C# 4.0和.NET 4.0中,我们有协方差和逆方差的概念,允许您将List<string>分配给IEnumerable<object>。
下面是一段在C# 4.0中工作的代码
public static void Test(IEnumerable<object> input) {
// do something
}
static void Main(string[] args) {
var input = new List<string>();
Test(input);
}发布于 2010-08-06 13:21:44
方法test()要求参数值是实现接口ICollection<object>的类型。确保List类这样做。
https://stackoverflow.com/questions/3421138
复制相似问题