2011-12-03 99 views
1
​​
  1. 为什么第一次调用Foo时不能编译?从对象派生的字符串。
  2. 如果我可以将列表转换为对象并将其编译,那么为什么编译器不会自己完成它?
+1

您使用的是什么版本的.NET? – Oded

回答

4

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

在以前的版本中,泛型类型必须匹配准确

我建议阅读关于variance(协方差和逆变)埃里克利珀的博客帖子。

+0

为什么它不能在.NET中编译<4.0? – gdoron

+1

因为它期望'IEnumerable '并且你传递了一个'IEnumerable '没有协方差信息(在C#4中引入这个接口),它不知道这样做是安全的。 –

+0

@gdoron - 因为编译器不理解方差和协方差,编译器的编写者没有进行这种推理。 – Oded

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

    string s = new object(); 
    

要强制用户“不安全”类型转换会向编译器提供太多的自由。

+0

在.NET 4.0中引入协变后,上面的语句在新框架中工作吗? – RSB