如果对象实现了该接口,我可以将IQueryable <Foo>传递给IQueryable <IFoo>吗?

leo*_*ora 2 c# .net-3.5

我有一个对象是:

IQueryable<Foo>
Run Code Online (Sandbox Code Playgroud)

我想将它传递给一个期望:

IQueryable<IFoo>
Run Code Online (Sandbox Code Playgroud)

Foo DOES实现了IFoo

为什么不编译?转换成这项工作的最佳方法是什么?

Ste*_*ary 5

在.NET 4 BCL中添加了协变量和反变量,并且在.NET 3.5 BCL中不存在.

通过使用Select强制转换为接口类型的操作,您可以在3.5中解决此限制:

IQueryable<Foo> foos = ..;
myFunc(foos.Select(x => (IFoo)x));
Run Code Online (Sandbox Code Playgroud)

编辑(来自里德的评论,如下):

IQueryable<Foo> foos = ..;
myFunc(foos.Cast<IFoo>());
Run Code Online (Sandbox Code Playgroud)

  • +1:我建议使用`foo.Cast <IFoo>()`代替:http://msdn.microsoft.com/en-us/library/bb301460.aspx (3认同)