As of C# 6, lambdas now default to instance methods, and will never be static (which I assume means they always capture now, which I guess is more efficient [seems to be faster given the discussions]).
See here: Why has a lambda with no capture changed from a static in C# 5 to an instance method in C# 6?
and here: Difference in CSC and Roslyn compiler's static lambda expression evaluation?
This causes issues now with using lambdas when creating static MethodInfos for calls to expression methods such as Expression.Convert(Expression, typeof({SomeType}), conversionMethodInfo);
So then, what is the new way of doing this? I tried to use the "static" modifier with lambdas and it doesn't work. For those who can't imagine such code, this might be one example:
Func <T1,T2> converter = static v => ConvertT1ToT2(v); // ('T' is whatever type you want)
Expression.Convert(expression, typeof({SomeType}), converter.Method) // (error: converter.Method.IsStatic is false)
Yes, obviously it doesn't work.
In case others wish to know, in the end, I had to promote (demote? lol) my expressions to "Expression-bodied function members" instead, like this:
then in my method body:
Edit: Some talk about non-capturing/static lambdas here: https://github.com/dotnet/csharplang/issues/275
There isn't one. The spec never promised anything about the implementation details of lambda expressions. Which is why you should not depend on them. It's also why What's new in C# 6 does not mention this.
Assuming you need to use
Expression.Convert
with a customMethodInfo
, then you should promote the lambda into astatic
method:This way, you're not using a lambda, so it's guaranteed the
MethodInfo
refers to astatic
method.