2011-12-03 135 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