Using AutoMapper, I hit a place where a named argument would\'ve fit very nicely:
.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(
Consider the following:
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 f = ()=>Q(n : N(), m: M());
Expression> x = ()=>Q(n : N(), m: M());
Func fx = x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());
You agree I hope that the last two lines must do exactly the same thing, right? Which is to print NM3
.
Now, what expression tree library calls would you like the expression tree conversion to generate that ensure this? There are none! We are therefore faced with the following choices:
Compile
method that takes the execution order into account. x = ()=>Q(n : N(), m: M());
actually be implemented as x = ()=>Q(M(), N());
and be incompatible with the non-expression-tree version.(1) is nice, but expensive. (2) is a non-starter; we can't in good conscience introduce this kind of "gotcha". (3) is cheap but irritating.
We chose (3).