2017-10-05 120 views
13

难道有人请帮助启迪我吗?无效切换语法生成成功?

我去登记入住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); 
} 

这里有没有表现出squigglies一些图像和它确实建立精细: Switch-No-Compiler-Error

而且,经过测试方法: Switch-Passing-Test

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

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

回答

11

这将编译因为你的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