gpt4 book ai didi

c# - 为什么表达式树不能包含命名参数规范?

转载 作者:IT王子 更新时间:2023-10-29 03:59:07 25 4
gpt4 key购买 nike

使用 AutoMapper,我找到了一个非常适合命名参数的地方:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, isAdvanced: false)))

但是编译器对我大吼:

An expression tree may not contain a named argument specification

所以我不得不恢复到:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, false)))

有谁知道为什么编译器在这种情况下不允许命名参数?

最佳答案

考虑以下几点:

static int M() { Console.Write("M"); return 1; }
static int N() { Console.Write("N"); return 2; }
static int Q(int m, int n) { return m + n; }
...
Func<int> f = ()=>Q(n : N(), m: M());
Expression<Func<int>> x = ()=>Q(n : N(), m: M());
Func<int> fx = x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());

你同意我希望最后两行必须做完全相同的事情,对吗?即打印NM3

现在,您希望表达式树转换生成哪些表达式树库调用以确保这一点?没有了!因此,我们面临以下选择:

  1. 实现表达式树库中的功能。在表达式树降低引擎中添加一个转换,以保留命名参数的执行顺序。在考虑执行顺序的 Compile 方法中实现代码。
  2. 使 x = ()=>Q(n : N(), m: M()); 实际上实现为 x = ()=>Q(M() , N()); 并且与非表达式树版本不兼容。
  3. 禁止在表达式树中命名参数。为此实现一条错误消息。

(1) 很好,但是很贵。 (2) 未启动;我们不能凭良心介绍这种“陷阱”。 (3) 便宜但令人恼火。

我们选择了(3)。

关于c# - 为什么表达式树不能包含命名参数规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10131772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com