Я открыл наше решение в Visual Studio 2015 вчера, и некоторые из наших модульных тестов (которые отлично работали в Visual Studio 2013) начали сбой. Диггер глубже я обнаружил, что это вызвано тем, что вызов GetTypes()
на сборке возвращал разные результаты. Я смог создать очень простой тестовый пример, чтобы проиллюстрировать его.
В Visual Studio 2013 и 2015 я создал новое консольное приложение с использованием .NET Framework 4.5.2. Я поместил следующий код в оба проекта.
class Program
{
static void Main(string[] args)
{
var types = typeof(Program).Assembly.GetTypes()
.Where(t => !t.IsAbstract && t.IsClass);
foreach (var type in types)
{
Console.WriteLine(type.FullName);
}
Console.ReadKey();
}
}
Когда я запускаю Visual Studio 2013, я получаю следующий вывод (как и ожидалось).
VS2013Example.Program
Когда я запускаю Visual Studio 2015, я получаю следующий вывод (не так, как ожидалось).
VS2015Example.Program
VS2015Example.Program + < > с
Итак, что это за тип VS2015Example.Program+<>c
? Оказывает это лямбда внутри метода .Where()
. Да, это правильно, так или иначе, что местная лямбда подвергается как тип. Если я прокомментирую .Where()
в VS2015, то я больше не получаю эту вторую строку.
Я использовал Beyond Compare для сравнения двух файлов .csproj, но единственными отличиями являются номер версии VS, GUID проекта, имена пространства имен по умолчанию и сборка, а VS2015 имеет ссылку на System.Net. Http, что VS2013 не сделал.
Кто-нибудь еще видел это?
Есть ли у кого-нибудь объяснение, почему локальная переменная будет отображаться как тип на уровне сборки?