我昨天在Visual Studio 2015中打開了我們的解決方案,我們的一些單元測試(在Visual Studio 2013中運行正常)開始失敗。深挖掘機我發現這是因爲在程序集上調用GetTypes()
返回不同的結果。我已經能夠創建一個非常簡單的測試案例來說明它。Assembly.GetTypes()在Visual Studio 2015中的行爲已更改
在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()
方法中的lambda。是的,這是正確的,不知何故,本地lambda被暴露爲類型。如果我在VS2015中註釋掉.Where()
,那麼我不會再獲得第二條線。
我已經使用Beyond Compare來比較兩個.csproj文件,但唯一的區別是VS版本號,項目GUID,默認命名空間和程序集的名稱,以及VS2015有一個對System.Net的引用.Http VS2013沒有。
有沒有其他人看到過這個?
有沒有人有解釋爲什麼一個局部變量會在彙編級別作爲類型暴露?
感謝您的信息。看起來有點可怕,因爲它感覺像一個變化,可能會導致很多現有的代碼工作得很好,突然出現錯誤。多年來,我已經忘記了我編寫代碼的次數,這些代碼列舉了程序集中的類型。感覺像'GetTypes()'應該可能有一個重載,讓開發人員明確地聲明他們是否希望包含編譯器生成的類型。 –
@CraigW。應該很容易編寫一個擴展方法,但我完全同意這是一個潛在的重大變化,因爲即使使用擴展方法,它不會默認調用,也許你應該在github上提交Roslyn團隊的問題? –
@克雷格這不是一個突破性的變化,那是一個***實現細節***。如果你在委託中捕獲了一個變量,你會看到相同的行爲。 –