Могу ли я использовать недавнее c# дополнение 'case when' для использования StartsWith в коммутаторе? - PullRequest
0 голосов
/ 02 марта 2020

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, string b, string c et c, который выглядит не очень хорошо.

Идеальным способом было бы конечно что-то вроде:

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

Есть ли элегантный способ решить эту проблему, или просто лучше использовать метод if..else if?

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Нет, вы не можете, потому что вы используете шаблон, совпадающий с оператором switch , и тип оценивается во время компиляции:

expr имеет время компиляции тип, который является базовым классом типа

В любом случае, вы можете использовать те же имена переменных, поскольку их область действия является локальной. 1010 * Reference *

0 голосов
/ 02 марта 2020

Я знаю, что вы сказали, что две разные строки - это нехорошо, но для меня это выглядит очень читабельно, есть ли проблема в том, чтобы сделать это следующим образом:

    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;  
    }
...