gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:09:58 25 4
gpt4 key购买 nike

谁能帮我解惑一下?

我去 checkin TFS 的一些更改,但我的 checkin 被拒绝了。它促使我查看我编辑的 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”这一行缺少“.”点运算符。如前所述,项目构建并运行;但未能通过门控构建服务器 checkin 。

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

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

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

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

并且,通过测试方法: Switch-Passing-Test

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

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

最佳答案

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

  • 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

关于c# - 无效的 Switch 语法构建成功了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46593584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com