2011-01-20 33 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>

相关问题