Visual Studio 2012中的C#编译器错误,VS2015中不再出现错误

时间:2016-07-19 20:24:04

标签: c# .net visual-studio

这更像是一个好奇心问题,因为修复既简单又明显。我使用Visual Studio 2015,但我的队友使用Visual Studio 2012.我们在同一个项目上工作。是的,这是一个坏主意,但我们很快就会解决这个问题。昨天,我检查了一些他整合到他的分支中的代码,并立即出现编译错误。这是代码(由于不是所有代码都已经简化了一点):

//Load basic project information from db
var projInfo = (from v in context.TPM_PROJECTVERSION
                join p in context.TPM_PROJECT on v.PROJECTID equals p.PROJECTID

                join pto in context.TPM_USER on v.TPM_USER1.USERID equals pto.USERID into primaryowner
                from subpto in primaryowner.DefaultIfEmpty()
                join pt in context.TPM_PROJECTTYPES on p.PROJECTTYPEID equals pt.PROJECTTYPEID
                where v.PROJECTID == projectId && v.VERSIONID == versionId
                select new
                {
                   ProjectName = v.NAME,
                   BusinessLaunchDate = p.BUSINESSLAUNCHDATE,
                   LearningExperiences = v.TPM_PROJECTVERSIONGAMEPLANS
                     .SelectMany(p => p.TPM_LEARNINGEXPERIENCES.Select(le => le.NAME)),
                }).First();

在我的机器上,这编译并正常工作。在他的机器上,他得到错误:

  
    

错误10名为' p'的局部变量不能在此范围内声明,因为它会给“父母”或“当前”中使用的“不同”含义。范围来表示别的东西

  

有问题的变量pp来电中的.SelectMany

.SelectMany(p => p.TPM_LEARNINGEXPERIENCES.Select(le => le.NAME)),

这显然与上述联接中定义的p冲突:

join p in context.TPM_PROJECT on v.PROJECTID equals p.PROJECTID

对我来说,这似乎很好。所以我将变量隐藏在我不再需要的外部范围中。我可以通过重命名其中一个p变量来解决编译错误。

我的问题:

我知道VS2012使用C#5.0,而VS2015使用C#6.0。 6.0是否在内部范围内对变量名称获得了更多 lenient ,或者是否有其他设置在此处发挥作用。为什么这是一个错误,另一个完全没问题?顺便说一句,我也没有收到任何警告,所以它不是将警告视为错误类型的东西。

想法?

1 个答案:

答案 0 :(得分:0)

作为避免奇怪错误的快速保存解决方案,请在两种环境中使用c#6统一建筑物。 您可以在每个项目的基础上将c#6.0作为NuGet包安装到VS2012中

通过Nuget安装C#编译器

Install-Package Microsoft.Net.Compilers

在测试环境中尝试此操作并检查此错误是否消失。