Этот код генерирует исключение в отмеченной строке:
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);
}
}
}
Теперь я протестировал этот код в VS2013 (работает как шарм) и в VS2015 Community (генерирует исключение).
Я следил за .Net Reference Source, который привел меня к некоторому кодовому условию, которое проверяет, предоставлен ли метод IsStatic
или нет.
В моем случае метод я pass (a.Method
) является статическим в VS2013 и по какой-то причине нестационарный (экземпляр) в VS2015. Если нет, то он подсказывает, что я не представил аргумент Instance
.
Почему так? Как этого можно избежать, чтобы Expression.Call
снова начал работать в новой Visual Studio?