使用AutoMapper,我找到了一个很适合命名参数的地方:
.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, isAdvanced: false)))
但是编译器对我大喊:
因此,我不得不恢复为:
.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
。现在,您希望表达式树库调用什么表达式树转换来生成以确保这一点?没有了!因此,我们面临以下选择:
Compile
方法中实现考虑了执行顺序的代码。 x = ()=>Q(n : N(), m: M());
实际上实现为x = ()=>Q(M(), N());
,并且与非表达式树版本不兼容。 (1)不错,但价格昂贵。 (2)是非入门者;我们不能良心介绍这种“陷阱”。 (3)价格便宜但令人讨厌。
我们选择了(3)。
关于c# - 为什么表达式树不能包含命名参数规范?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10131772/