#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, замаскированное под aswitch
. Также потребуется объявление новой переменной для каждой ветви «switch», что неэффективно.2. Может быть, читателю так повезет, что он будет работать над кодом, где объявления переменных вносят значительный вклад в повышение производительности 🙂
3. Я согласен, что это вряд ли будет проблемой, но всегда полезно точно объяснить, что что-то делает за кулисами, чтобы читатели могли принять наиболее подходящее решение для своего варианта использования. Большая часть синтаксического сахара, добавляемого в C # в настоящее время, скрывает большую сложность.