我正在使用通用容器类,我正在尝试编写一个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继承。
有没有解决这个限制的方法?
答案 0 :(得分:2)
请注意,即使Bar
继承自Base
- Foo<Bar>
和Foo<Base>
,也是两种完全不同的通用类型,与继承无关。
Bar
和Base
是类型参数,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>
无法分配兼容