C# 为什么可以';表达式树是否包含命名参数规范?
使用AutoMapper,我找到了一个命名参数非常适合的地方:C# 为什么可以';表达式树是否包含命名参数规范?,c#,c#-4.0,expression-trees,C#,C# 4.0,Expression Trees,使用AutoMapper,我找到了一个命名参数非常适合的地方: .ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, isAdvanced: false))) 但编译器对我大喊大叫: 表达式树不能包含命名参数规范 所以我不得不回到: .ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyPropert
.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());
static int M(){Console.Write(“M”);返回1;}
静态int N(){Console.Write(“N”);返回2;}
静态int Q(int m,int n){返回m+n;}
...
Func f=()=>Q(n:n(),m:m());
表达式x=()=>Q(n:n(),m:m());
Func fx=x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());
你同意我希望最后两行必须做完全相同的事情,对吗?用于打印NM3
现在,您希望表达式树转换生成哪些表达式树库调用来确保这一点?没有!因此,我们面临以下选择:
Compile
方法中实现代码李>
x=()=>Q(n:n(),m:m())
实际上可以实现为x=()=>Q(M(),N())代码>并且与非表达式树版本不兼容
我们选择了(3)。我觉得这个错误消息确实应该记录下来以避免这种影响。换句话说,在msdn中搜索确切的错误消息字符串应该可以为我们提供这一澄清。这太棒了-谢谢Eric。直到现在,我才真正了解到
Expression
和Func
之间的区别。然而,当你说(1)会很昂贵时,这是指开发成本还是计算成本昂贵?@BrandonLinton:开发、测试、记录和维护都会很昂贵,尤其是与它提供的非常小的好处相比。我们本来可以在一开始就选择支持它——毕竟,VB一直都有方法调用的命名参数——但我们选择不支持。