Видимо это надо куда-то зарепортить в MS, но не знаю куда. Может те, кто тут тусуются из команды шарпа увидят и определят куда надо.
Создаём консольный проект в VS 2012 и вбиваем такой код:
using System;
using System.Linq.Expressions;
namespace VS2013Compatibility
{
class Program
{
static void Main(string[] args)
{
Expression<Func<string>> f1 = () => 0.ToString();
Expression<Func<string>> f2 = () => 0l.ToString();
var mi1 = ((MethodCallExpression)f1.Body).Method;
var mi2 = ((MethodCallExpression)f2.Body).Method;
var mi3 = typeof(int).GetMethod("ToString", new Type[0]);
Console.WriteLine(mi1 == mi2);
Console.WriteLine(mi1.DeclaringType);
Console.WriteLine(mi2.DeclaringType);
Console.WriteLine(mi3.DeclaringType);
}
}
}
Запускаем и получаем результат:
False
System.Int32
System.Int64
System.Int32
Теперь открываем тот же проект в VS 2013, пересобираем и запускаем. Получаем:
True
System.Object
System.Object
System.Int32
Причём интересно, что такое поведение характерно только для примитивных типов. Для того же Guid expression tree будет построен для object.ToString и в VS 2012. Хотя typeof(Guid).GetMethod("ToString", new Type[0]) выдаст результат для Guid.ToString. В общем, бардак.