"内联临时变量" (IDE0019)修复与接口一起使用时会导致语法错误

时间:2017-07-06 21:38:52

标签: c# if-statement interface

我在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上。

1 个答案:

答案 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功能,并且项目引用该程序包,请确保也更新该程序包,否则如果项目是,则将使用该程序包中包含的编译器设置为"默认"编译器。