This code throws an exception on the marked line:
using System;
using System.Linq.Expressions;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Action<int, int> a = (x, y) => Console.WriteLine(x + y);
ParameterExpression p1 = Expression.Parameter(typeof(int), "p1");
ParameterExpression p2 = Expression.Parameter(typeof(int), "p2");
// Here is the exception ArgumentNullException.
MethodCallExpression call = Expression.Call(a.Method, p1, p2);
}
}
}
Now, I've tested this code in VS2013 (works like a charm) and in VS2015 Community (throws the exception).
I followed the .Net Reference Source, which led me to some code condition which checkes whether the supplied method IsStatic or not.
In my case, the method I pass (a.Method) is static in VS2013 and for some reason non static (instance) in VS2015. If not, it throws, telling me that I did not supply the Instance argument.
Why is it so? How can this be avoided so that Expression.Call would begin to work again in new Visual Studio?
Expression.Invoke(Expression.Constant(a), p1, p2)Expression.Convert(Expression, typeof({SomeType}), conversionMethodInfo);fails now because of this.conversionMethodInfowas created from a lambda, but is now no longer considered static.