2011-01-20 37 views
1

我有通用的容器類我正在使用,我試圖寫一個OfType例程。然而,我傳入的類型也是泛型。這裏有一個例子:如何編寫OfType <Foo<Bar>>()

Entities.OfType<Foo<Bar>>() 

和我的函數定義:

public IEnumerable T OfType<T>() 
{ 
    foreach (var e in Values) 
     if (e is T) 
      yield return (T)e; 
} 

如果實體被定義爲Foo<Base>集合我得到一個錯誤Foo<Bar>不會Foo<Base>繼承。但是Bar繼承自Base。

有沒有辦法解決這個限制?

+5

查找協變和逆變。 – Mehrdad 2011-01-20 15:19:15

回答

2

注意,從Base即使Bar繼承 - Foo<Bar>Foo<Base>是通過繼承不涉及兩個完全不同的泛型類型。

BarBase在這種情況下是類型參數,而C#4.0支持泛型接口的協方差/協變性,這可以幫助您解決問題。

你的代碼將工作在C#4.0,如果Foo被聲明爲以下接口:

interface IFoo<in T> { /* methods, etc. */ } 

,在IFoo沒有方法可以返回T

您可以將IFoo<Base>對象分配給類型IFoo<Bar>的變量,其中Bar繼承自Base。這是反例的一個例子。

0

C#泛型不是協變的。一個Foo<Bar>不是分配兼容Foo<Base>

相關問題