无效的 Switch 语法构建成功?

Posted

技术标签:

【中文标题】无效的 Switch 语法构建成功?【英文标题】:Invalid Switch syntax builds successfully? 【发布时间】:2017-10-05 19:39:52 【问题描述】:

有人可以帮我解惑吗?

我去签入了对 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);

以下是一些没有显示波浪线的图像,它确实构建得很好:

并且,通过测试方法:

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

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

【问题讨论】:

【参考方案1】:

这是因为您的 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

【讨论】:

以上是关于无效的 Switch 语法构建成功?的主要内容,如果未能解决你的问题,请参考以下文章

Java开发者!switch语法结构java

为什么我的Django应用程序在Azure上使用UUID无效语法失败

未捕获的语法错误。在<input id={{供应商.id }}中出现无效或意外的标记。

如何配置 Jest 以转换包含无效语法的模块?

JAVA基本语法-switch注意事项

Thymeleaf 迭代,if,switch语法