【问题标题】:C# 7.0 Value Tuple compile error?C# 7.0 值元组编译错误?
【发布时间】:2018-06-16 17:02:30
【问题描述】:

当我试图编译以下代码时:

var post = iPostService.GetAll().Select(x => (x.Title, x.Author));

我收到编译器错误:“表达式树可能不包含元组文字。”

所以我也试过这个:

var post = iPostService.GetAll().
                    Select(x => new ValueTuple<string, string>(x.Title, x.Author))

结果是运行时错误:'Cannot resolve method Void .ctor(System.String, System.String) 因为方法句柄 System.ValueTuple`2[T1,T2] 的声明类型是通用的。向 GetMethodFromHandle 显式提供声明类型。'

我搜索了这个问题的解决方案,但没有任何帮助。

非常感谢任何帮助。

谢谢

【问题讨论】:

标签: asp.net linq-to-entities expression-trees c#-7.0 valuetuple


【解决方案1】:

它对我有用,先创建一个元组并将其转换为一个ValueTuple:

var post = iPostService.GetAll().
           Select(x => new Tuple<string, string>(x.Title, x.Author).ToValueTuple())

【讨论】:

  • 绝妙的答案!这个问题阻止我模拟我的自动映射器方法 CreateMap(我在其中使用元组)。有关此问题(“表达式树可能不包含元组文字”)为何存在的更多信息:damirscorner.com/blog/posts/…
【解决方案2】:

最后,我发现我的代码出了什么问题:

  • 我正在使用延迟执行,因此在执行构造函数时不会从数据库加载数据。
  • 解决方法是在创建实例命令之前添加转换运算符。

希望它适用于您的代码。

【讨论】:

  • 就我而言,为了处理延迟执行,我只是在我的 Select() 语句之前添加了 .AsEnumerable()
  • 正如@jack 所说。在 Select() 投影之前添加 AsEnumerable() 会使内部的 lambda 成为委托函数而不是表达式树,这确实允许元组文字
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多