【发布时间】:2015-07-21 14:34:43
【问题描述】:
我昨天在 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+c
那么VS2015Example.Program+<>c 类型是什么?原来它是 .Where() 方法中的 lambda。是的,没错,本地 lambda 以某种方式被公开为一种类型。如果我在 VS2015 中注释掉 .Where(),那么我将不再得到第二行。
我使用 Beyond Compare 比较了两个 .csproj 文件,但唯一的区别是 VS 版本号、项目 GUID、默认命名空间和程序集的名称,而 VS2015 引用了 System.Net。 VS2013 没有的那个http。
还有其他人看过吗?
有没有人解释为什么局部变量会在程序集级别作为类型公开?
【问题讨论】:
标签: c# visual-studio-2013 compiler-construction visual-studio-2015 roslyn