强类型集合隐式和显式强制转换

时间:2011-12-03 21:55:39

标签: c# .net generics casting

public void Foo (IEnumerable<object> objects)
{
}

var strings = new List<string>{"first", "second", "third"};
Foo(strings); // Compilation Error.
Foo(strings.Cast<object>()); // O.k.
  1. 为什么第一次调用Foo不能编译?从对象派生的字符串。
  2. 如果我可以将列表转换为对象并进行编译,为什么编译器不能自己编写呢?

3 个答案:

答案 0 :(得分:4)

第一个调用在.NET 4.0中编译。

在以前的版本中,泛型类型必须与完全匹配

我建议阅读Eric Lippert关于variance的博客文章(协方差和逆变)。

答案 1 :(得分:0)

  1. 泛型是严格的,因为您无法将派生类型的集合分配给超类型的集合。您必须提供用于实例化集合的确切类型。
  2. 因为它无法知道你想做什么。以下行无法编译的原因相同:

    string s = new object();
    
  3. 强制对用户施加“不安全”类型转换会给编译器带来太大的自由。

答案 2 :(得分:0)

你不想抬头co-variance and contra-variance

这是.NET 4.0中的新功能