簡體   English   中英

Visual Studio 2012中的C#編譯器錯誤,VS2015中不再出現錯誤

[英]C# compiler error in Visual Studio 2012, no longer error in VS2015

這更像是一個好奇心問題,因為修復既簡單又明顯。 我使用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”已在“父級或當前”范圍中用於表示其他內容

有問題的變量p.SelectMany調用中的p

.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對內部作用域中的變量名稱是否更寬松 ,或者是否有其他一些設置在這里發揮作用。 為什么這是一個錯誤,另一個完全沒問題? 順便說一句,我也沒有收到任何警告,所以它也不是一個錯誤類型的治療警告

想法?

作為避免奇怪錯誤的快速保存解決方案,請在兩種環境中使用c#6統一建築物。 您可以在每個項目的基礎上將c#6.0作為NuGet包安裝到VS2012中

通過Nuget安裝C#編譯器

Install-Package Microsoft.Net.Compilers

在測試環境中嘗試此操作並檢查此錯誤是否消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM