В C #, как выполнить сопоставление с шаблоном с помощью switch для непостоянного строкового значения?

#c# #c#-10.0

#c# #c #-10.0

Вопрос:

В C #, как выполнить сопоставление с шаблоном с помощью switch для непостоянного строкового значения?

Я хотел бы иметь возможность использовать непостоянные строковые переменные в качестве цели сопоставления в операторе switch.

У меня есть приведенный ниже код, но я сталкиваюсь с ошибкой CS0150: A constant value is expected в case expectedValue:

 public bool UseStandardSwitch(string inputValue)
{
    var expectedValue = "SomeValue";

    bool result = default;
    var DoSomething = () => { result = true; };
            
    switch (inputValue)
    {
        case expectedValue:
            DoSomething();
            break;
        default:
            break;
    }
    return resu<
}
 

Есть ли способ добиться аналогичного результата?

Комментарии:

1. Зачем вообще использовать switch, похоже, работа для простого if , нет?

2. nvoigt, код не предназначен для отражения реалистичного варианта использования. Цель состоит в том, чтобы выделить синтаксис.

Ответ №1:

Нет необходимости вводить переменную (как в вашем ответе) — вы можете использовать discard с защитой от регистра:

 public bool UseStandardSwitch(string inputValue)
{
    var expectedValue = Console.ReadLine()!;
    Func<bool> DoSomething = () => true;
    
    return inputValue switch
    {
        _ when inputValue.Equals(expectedValue) => DoSomething(),
        _ when inputValue.Equals(expectedValue   "1") => DoSomething(),
        _ => throw new ArgumentException(),
    };
}
 

Комментарии:

1. В какой версии C # это было введено?

2. @Error404Brainnotfound я считаю, начиная с C # 8.

Ответ №2:

Вы можете использовать шаблон var для выполнения чего-то подобного.

Попробуй это:

 public bool UsePatternMatching(string value)
{
    var DoSomething = () => true;

    return value switch
    {
        var str when str.Equals("SomeValue") => DoSomething(),
        _ => throw new ArgumentException(),
    };
}
 

ОБНОВЛЕНИЕ: Смотрите Сообщение Строна для получения улучшенного ответа.

Комментарии:

1. Однако это не a switch … это if-else, замаскированное под a switch . Также потребуется объявление новой переменной для каждой ветви «switch», что неэффективно.

2. Может быть, читателю так повезет, что он будет работать над кодом, где объявления переменных вносят значительный вклад в повышение производительности 🙂

3. Я согласен, что это вряд ли будет проблемой, но всегда полезно точно объяснить, что что-то делает за кулисами, чтобы читатели могли принять наиболее подходящее решение для своего варианта использования. Большая часть синтаксического сахара, добавляемого в C # в настоящее время, скрывает большую сложность.