无效的 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
.
有没有大神帮忙解惑一下?
我去签入 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
.