Видимо это надо куда-то зарепортить в 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. В общем, бардак.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Разобрался. Это был великий и ужасный Microsoft (R) Roslyn C# Compiler
Офигеть! Блин, я уже додумался до проблем с reference assemblies, но самое очевидное — заменён компилятор — пропустил
Здравствуйте, IT, Вы писали:
IT>Видимо это надо куда-то зарепортить в MS, но не знаю куда. Может те, кто тут тусуются из команды шарпа увидят и определят куда надо.
Я открыл баг по поводу этой проблемы (DevDiv 839441).