无效的 Switch 语法构建成功了吗?

Invalid Switch syntax builds successfully?

有没有大神帮忙解惑一下?

我去签入 TFS 的一些更改,但我的签入被拒绝了。它促使我查看我编辑的 switch 语句。

我发现 Visual Studio 2017 声称不存在编译时问题,并允许我成功构建和部署应用程序。最重要的是,甚至该方法的单元测试似乎都按预期通过了。

public enum PaymentStatus
{
    Issued,
    Cleared,
    Voided,
    Paid,
    Requested,
    Stopped,
    Unknown
}

public class PaymentViewModel
{
    public PaymentStatus Status { get; set; }

    ...

    public String StatusString
    {
        get
        {
            switch (this.Status)
            {
                case PaymentStatus.Cleared:
                    return "Cleared";
                case PaymentStatus.Issued:
                    return "Issued";
                case PaymentStatus.Voided:
                    return "Voided";
                case PaymentStatus.Paid:
                    return "Paid";
                case PaymentStatus.Requested:
                    return "Requested";
                case PaymentStatus.Stopped:
                    return "Stopped";
                case PaymentStatus Unknown:
                    return "Unknown";
                default:
                    throw new InavlidEnumerationException(this.Status);
            }
        }
    }
}

因此,请注意 "case PaymentStatus Unknown" 行缺少“.”点运算符。如前所述,项目构建并运行;但未能通过门控构建服务器签入。

另外,请注意以下测试正在通过:

[TestMethod]
public void StatusStringTest_Unknown()
{
    var model = new PaymentViewModel()
    {
        Status = PaymentStatus.Unknown
    }

    Assert.AreEqual("Unknown", model.StatusString);
}

这里有一些没有波浪形的图像,它确实构建得很好:

并且,通过测试方法:

最后,请注意我 运行 只使用静态字符串而不是使用资源文件进行测试,它通过了。为了简单起见,我在上面的代码中省略了资源文件内容。

非常感谢对此的任何想法!提前致谢!

之所以编译,是因为您的 Visual Studio 将 PaymentStatus Unknown 解释为模式匹配,这是 C# 7 的 new feature

  • PaymentStatus是类型,
  • Unknown是名字,
  • 无条件(即模式始终匹配)。

这种语法的预期用例是这样的:

switch (this.Status) {
    case PaymentStatus ended when ended==PaymentStatus.Stopped || ended==PaymentStatus.Voided:
        return "No payment for you!";
    default:
        return "You got lucky this time!";
}

如果 TFS 设置为使用旧版本的 C#,它将拒绝此源。

注意:您的单元测试之所以有效,是因为其余的案例都正确完成了。但是,抛出 InavlidEnumerationException(this.Status) 的测试用例会失败,因为开关会将任何未知值解释为 PaymentStatus.Unknown.