C# 7中使用元组进行模式匹配

14

在使用C# 7中,是否可以在switch语句中使用元组进行模式匹配,像这样:

switch (parameter)
{
   case ((object, object)) tObj when tObj.Item1 == "ABC":
        break;
}

我收到一个错误,上面说tObj在当前上下文中不存在

我也尝试过这个方法:

switch (parameter)
{
   case (object, object) tObj when tObj.Item1 == "ABC":
        break;
}

这个运作良好:

switch (parameter)
{
   case MachineModel model when model.Id == "123":
        break;
}

这个回答解决了你的问题吗?如何在 switch 语句中使用 C# 元组值类型 - Mike Nakis
1个回答

20

请记住,C#7元组只是语法糖,因此(object, object)实际上就是System.ValueTuple<object, object>

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

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

另外,由于“var pattern”可以匹配任何内容并保留其类型,因此上述内容可以简化为:

switch (parameter)
{
    case var tObj when tObj.Item1 == "x":
        break;
}

2
@DavidArno 感谢您的编辑,但是使用 var 存在一个问题。如果 parameterobject 类型,并且 switch 语句也用于检查类型,则会失败。例如 - DavidG
好观点。我从问题中假设parameter是一个元组,但这可能是一个错误的假设。 - David Arno
2
@DavidArno 我认为它几乎肯定是这样,这就是为什么我没有调整你的编辑。只是觉得在这里提一下很值得。 - DavidG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接