Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';表达式树是否包含命名参数规范?_C#_C# 4.0_Expression Trees - Fatal编程技术网

C# 为什么可以';表达式树是否包含命名参数规范?

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

使用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());
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
    方法中实现代码
  • Make
    x=()=>Q(n:n(),m:m())
    实际上可以实现为
    x=()=>Q(M(),N())并且与非表达式树版本不兼容
  • 不允许在表达式树中使用命名参数。实现一个这样的错误消息
  • (1) 很好,但是很贵。(2) 是一个非初学者;我们不能凭良心介绍这种“抓住你了”。(3) 价格便宜但令人恼火


    我们选择了(3)。

    我觉得这个错误消息确实应该记录下来以避免这种影响。换句话说,在msdn中搜索确切的错误消息字符串应该可以为我们提供这一澄清。这太棒了-谢谢Eric。直到现在,我才真正了解到
    Expression
    Func
    之间的区别。然而,当你说(1)会很昂贵时,这是指开发成本还是计算成本昂贵?@BrandonLinton:开发、测试、记录和维护都会很昂贵,尤其是与它提供的非常小的好处相比。我们本来可以在一开始就选择支持它——毕竟,VB一直都有方法调用的命名参数——但我们选择不支持。