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

问题描述 投票:0回答:2

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方法是否更好?

c# switch-statement
2个回答
0
投票

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

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

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


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;  
    }
© www.soinside.com 2019 - 2024. All rights reserved.