我可以使用最近的c#加法“ case when”子句在开关中使用StartsWith吗?

时间:2020-03-02 09:19:18

标签: c# switch-statement

case when是相当新的东西,因此没有很多答案。 MSDN示例是关于强制转换对象的,而不是使用原始字符串。

switch (catName)
{
    case string c when c.StartsWith("Fluffy"):
        // DoSomething
        break;
}

这似乎可行,如果您可以省略string c部分,而只需执行when catName,那就更好了。但随后有多种情况不起作用:

switch (catName)
{
    case string c when c.StartsWith("Fluffy"):
    case string c when c.StartsWith("Mr"):
        // DoSomething
        break;
}

因为您不能声明两个string c。因此,您可以更改第二个,但最终会得到一个看起来不太好的字符串a,字符串b,字符串c等的列表。

理想的方法当然是:

switch (catName)
{
    case when catName.StartsWith("Fluffy"):
        ...
        break;
}

有没有解决此问题的好方法,还是使用if..else if方法更好?

2 个答案:

答案 0 :(得分:0)

我知道您说过两个不同的字符串不是很好,但这对我来说似乎很容易理解,这样做真的有问题吗?

    string catName = "Fluffy";
    switch (catName)
    {
        case string c when c.StartsWith("Fluffy"):
        case string d when d.StartsWith("Mr"):
            Console.WriteLine(catName); 
            break;  
        default:
            Console.WriteLine("Name does not start with Mr or Fluffy.");  
            break;  
    }

或者,根据Krustys答案中的“参考”链接,您可以这样做:

    string catName = "Noodle";
    switch (catName)
    {
        case string c when (c.StartsWith("Fluffy") || c.StartsWith("Mr")):
            Console.WriteLine(catName); 
            break;  
        default:
            Console.WriteLine("Name does not begin with Mr or Fluffy.");    
            break;  
    }

答案 1 :(得分:0)

不能,因为您正在使用the pattern matching into the switch statement并且类型是在编译时评估的:

expr的编译时类型是类型的基类

无论如何,您可以使用相同的变量名,因为它们的作用域是本地的。 Reference