C#7模式与元组匹配

jha*_*100 13 c# pattern-matching switch-statement c#-7.0

是否可以使用c#7在switch语句中使用模式匹配的元组,如下所示:

switch (parameter)
{
   case ((object, object)) tObj when tObj.Item1 == "ABC":
        break;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个错误说tObj does not exist in the current context.

我也试过这个:

switch (parameter)
{
   case (object, object) tObj when tObj.Item1 == "ABC":
        break;
}
Run Code Online (Sandbox Code Playgroud)

这很好用:

switch (parameter)
{
   case MachineModel model when model.Id == "123":
        break;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*idG 19

请记住,C#7元组只是语法糖,所以(object, object)真的只是System.ValueTuple<object, object>.

我想开发团队没有考虑到元组的新语法这种特殊情况,但你可以这样做:

switch (parameter)
{
    case System.ValueTuple<object, object> tObj when tObj.Item1 == "x":
        break;
}
Run Code Online (Sandbox Code Playgroud)

此外,由于"var pattern"将匹配任何内容并尊重类型,因此上述内容可以简化为:

switch (parameter)
{
    case var tObj when tObj.Item1 == "x":
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • @DavidArno感谢编辑,但使用`var`有一个问题.如果`parameter`的类型为`object`并且switch语句也用于检查类型,则它将失败.[例如](https://gist.github.com/WiredUK/21d1a61c01580a2fe7b055ec83b46889) (2认同)
  • @DavidArno我认为几乎可以肯定,这就是为什么我没有调整你的编辑.只是觉得这里值得一提. (2认同)