如何写OfType <foo <bar>&gt;()</foo <bar>

时间:2011-01-20 15:18:14

标签: c#

我正在使用通用容器类,我正在尝试编写一个OfType例程。然而,我传入的类型也是泛型。这是一个例子:

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继承。

有没有解决这个限制的方法?

3 个答案:

答案 0 :(得分:2)

请注意,即使Bar继承自Base - Foo<Bar>Foo<Base>,也是两种完全不同的通用类型,与继承无关。

在这种情况下,

BarBase是类型参数,C#4.0支持通用接口的协方差/逆变,可以帮助您解决问题。

如果Foo是声明如下的接口,那么您的代码将在C#4.0中运行:

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

注意 IFoo中的任何方法都不能返回T

您可以将IFoo<Base>对象分配给IFoo<Bar>类型的变量,其中Bar继承自Base。这是逆变的一个例子。

答案 1 :(得分:0)

感谢兰伯特!通过维基百科找到此链接:

http://www.buunguyen.net/blog/new-features-of-csharp-4.html

@Lambert,如果您想将评论重写为回复,我会接受。

答案 2 :(得分:0)

C#泛型不协变。 Foo<Bar>Foo<Base>无法分配兼容