无效的 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 语法构建成功?的主要内容,如果未能解决你的问题,请参考以下文章
为什么我的Django应用程序在Azure上使用UUID无效语法失败