2017-07-06 30 views
2

我在ActionFilter中從ViewData.Model得到object,我需要確保它符合給定的接口。這裏有一個例子:「內聯臨時變量」(IDE0019)修復與接口一起使用時會導致語法錯誤

object d = DateTime.Now; 
IComparable c = d as IComparable; 
if (c != null) 
{ 
    //do stuff 
} 

的Visual Studio 2017年給了我一個IDE0019在第二行「內聯臨時變量」的建議。選擇它重構代碼到這:

object d = DateTime.Now; 
if (d is IComparable c) // Line 31 
{ 
    //do stuff 
} 

我喜歡這種語法,我想使用它。有沒有在編輯器中顯示錯誤,但建設時,我得到錯誤的一長串:

1>C:\Users\me\MyProject\MyFile.cs(31,34,31,35): error CS1026:) expected 
1>C:\Users\me\MyProject\MyFile.cs(31,35,31,36): error CS1002: ; expected 
1>C:\Users\me\MyProject\MyFile.cs(31,35,31,36): error CS1513: } expected 

第31行是if聲明。它看起來像編譯器期待更多的語法,但我無法弄清楚什麼。生成的代碼看起來與這個例子從the documentation for is

public int CompareTo(Object o) 
{ 
    if (o is Employee e) 
    { 
     return Name.CompareTo(e.Name); 
    } 
    throw new ArgumentException("o is not an Employee object."); 
} 

如何解決這些錯誤?我在VS2017(26430.14)和.NET Framework v4.0.30319上。

+0

現有的項目還是新的?更新所有軟件包?它編譯後是否真的運行?你有ReSharper嗎?該項目是否使用C#7編譯器(屬性 - >生成 - >高級)? – CodeCaster

+0

@CodeCaster現有的ASP.NET MVC項目。構建失敗並且錯誤出現在構建輸出中,但不在錯誤列表中。 – Undo

+0

@CodeCaster屬性 - 編譯 - 我的啓動項目中的高級顯示「默認」作爲語言版本 - 不知道這意味着什麼。不確定我是否有ReSharper。我在哪裏看? – Undo

回答

3

VS 2017 - New C# 7 feature for out parameters causes project not to build發現:

更新Microsoft.Net.Compilers包解決了我的asp.net MVC項目的問題。

What is the Purpose of Microsoft.Net.Compilers?

的Microsoft.Net.Compilers包的一點是,與包分發的編譯器將用於編譯項目,而不是隨.NET編譯器框架或與Visual Studio。

因此,如果您要升級較舊的項目以使用C#7功能,並且項目引用該軟件包,請務必更新該軟件包,否則該軟件包中包含的編譯器將用於該項目被設置爲「默認」編譯器。