c# - IQueryable 转换

标签 c# .net lambda expression iqueryable

为什么可以在“OK”行进行转换,而在“NOT OK”行则不行?

var queryable = new int[]{1, 2, 3}.AsQueryable();

var x = (Expression<Func<IQueryable<int>>>)(() => (from c in queryable select c));

var yy = (Expression<Func<IEnumerable<int>>>)x;  // NOT OK (does not compile)
var zz = (Expression<Func<IEnumerable<int>>>)(() => (from c in queryable select c)); // OK

更新:错误信息是:

Cannot convert type System.Linq.Expressions.Expression<System.Func<System.Linq.IQueryable<int>>> to 'System.Linq.Expressions.Expression<System.Func<System.Collections.Generic.IEnumerable<int>>>'

最佳答案

因为 Expression是一个类并且IEnumerable是一个接口(interface)。类不是协变的,而接口(interface)和委托(delegate)是协变的。

这意味着您无法转换 Expression<A>Expression<B>即使 B 是 A 的基类。

所以如果这一行:

() => (from c in queryable select c)

返回

Func<IQueryable<int>>

它可以转换成

Func<IEnumerable<int>>

但如果你已经拥有

Expression<Func<IQueryable<int>>>

不能转换成

Expression<Func<IEnumerable<int>>>

关于c# - IQueryable 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629603/

相关文章:

c# - Lambda 分配局部变量

c# - 类型 'System.Int32' 的表达式不能用于返回类型 'System.Object'

c# - 在 C# 中是否可以使用内部 AND protected 成员?

c# - 使用程序集作为许可证文件的优点/缺点?

c# - 使用套接字的简单 Http 代理 : Questions

c# - System.Web.Http Server 是否对 ASP.Net Web API 单元测试表现良好?

c++ - 断言中的 Lambda

c# - 具有 [Authorize] 的环境相关 Controller

c# - 如何分析一行代码?

c# - 定期从内存流播放音频 C#