2011-03-19 41 views
2
public class Entity 
{ 
    public int Id {get;set;} 
} 

public class Foo : Entity 
{ 
    public string Name {get;set;} 
} 


//foos is an IEnumerable<Foo> with List<Foo> value 

foos as IEnumerable<Entity> //works in .net 4.0, doesn't work in 3.5, 

如何讓3.5型鑄件3.5不工作在4.0

回答

3

由於JoDG指出,這是由新協方差的特徵在C#4啓用 - 你可以在C#中3得到最接近的是:

IEnumerable<Entity> entities = foos.Cast<Entity>(); 
+0

太糟糕了,我的foos被裝箱爲對象,所以我無法真正使用cast – Omu 2011-03-19 18:24:35

+0

@Omu - 在這種情況下,您必須首先投射它: '((IEnumerable )foos).Cast ()'。 – Lee 2011-03-19 18:28:02

+0

好吧,它並不總是IEnumerable 有時它是IEnumerable 或實體 – Omu 2011-03-19 18:38:10

7

類似的這種行爲上的結構依賴於它在.NET 4.0中引入的協方差/逆變。您無法在早期版本中使用此功能。

這裏有一個關於它的好文章:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

+0

是不是有解決這個任何其他方式,我只是想同樣的結果,並沒有多麼 – Omu 2011-03-19 18:13:20

+0

@Omu:看回答:'IEnumerable entities = foos.Cast ();' – JoDG 2011-03-19 18:17:25

1

無鈷/逆變你要投自己:

var entities = foos.Cast<Entity>(); // yields IEnumerable<Entity>