Багофича компилятора из VS 2013
От: IT Россия linq2db.com
Дата: 02.12.13 05:59
Оценка: 10 (2)
Видимо это надо куда-то зарепортить в 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. В общем, бардак.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.