【问题标题】:C# 7 Pattern Match with a tupleC# 7 模式匹配与元组
【发布时间】:2017-11-26 03:39:08
【问题描述】:

是否可以像这样在使用 c# 7 的 switch 语句中使用具有模式匹配的元组:

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

我收到一条错误消息,上面写着tObj does not exist in the current context

我也试过了:

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

这很好用:

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

【问题讨论】:

    标签: c# switch-statement pattern-matching c#-7.0


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • @DavidArno 感谢您的编辑,但使用var 存在一个问题。如果parameterobject 类型并且switch 语句也被用于检查类型,它将失败。 For example
    • 好点。我从问题中假设 parameter 是一个元组,但这可能是一个错误的假设。
    • @DavidArno 我认为几乎可以肯定,这就是为什么我没有调整您的编辑。只是觉得这里值得一提。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-06-12
    • 2018-09-23
    相关资源
    最近更新 更多