我在ActionFilter中从object
获得ViewData.Model
,我需要确保它符合给定的界面。这是一个例子:
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 :(得分: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 Framework或Visual Studio附带的编译器。
因此,如果您要升级较旧的项目以使用C#7功能,并且项目引用该程序包,请确保也更新该程序包,否则如果项目是,则将使用该程序包中包含的编译器设置为"默认"编译器。