这更像是一个好奇心问题,因为修复既简单又明显。我使用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'的局部变量不能在此范围内声明,因为它会给“父母”或“当前”中使用的“不同”含义。范围来表示别的东西
有问题的变量p
是p
来电中的.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 ,或者是否有其他设置在此处发挥作用。为什么这是一个错误,另一个完全没问题?顺便说一句,我也没有收到任何警告,所以它不是将警告视为错误类型的东西。
想法?
答案 0 :(得分:0)
作为避免奇怪错误的快速保存解决方案,请在两种环境中使用c#6统一建筑物。 您可以在每个项目的基础上将c#6.0作为NuGet包安装到VS2012中
通过Nuget安装C#编译器
Install-Package Microsoft.Net.Compilers
在测试环境中尝试此操作并检查此错误是否消失。