Подтвердить что ты не робот

Установка переменной на результат переключения

Неужели я сумасшедший или есть способ в С# установить переменную в результат переключения? Что-то вроде:

 var a = switch(b)
    {
     case c:
     d;
     case e:
     f;
     default:
     g;
    };

Возможно ли это на любом другом языке? Я просто подумал, что это так, но я не собираюсь компилировать. Спасибо заранее.

4b9b3361

Ответ 1

Нет, switch - это выражение, а не выражение, которое можно оценить.

Конечно, вы можете извлечь его в другой метод:

int x = DoSwitch(y);

...

private int DoSwitch(int y)
{
    switch (y)
    {
        case 0: return 10;
        case 1: return 20;
        default: return 5;
    }
}

В качестве альтернативы вы можете использовать Dictionary, если это просто случай простых постоянных сопоставлений. Если вы можете дать нам больше информации о том, чего вы пытаетесь достичь, мы, вероятно, можем помочь вам выработать самый идиоматический способ добраться туда.

Ответ 2

Нет, вы не можете использовать оператор switch в качестве выражения. Другой способ записать это вложенные условные операторы:

var a = b == c ? d:
        b == e ? f:
                 g;

Ответ 3

Если вы не особенно заботились об эффективности, было бы довольно легко приготовить небольшой класс с использованием дженериков, которые позволили бы вам использовать "беглую" цепочку вызовов методов, таких как:

var a=Switch(b).Case(c).Then(d).Case(e).Then(f).Default(g);

или, если хотите, более компактный

var a=Switch(b).Case(c, d).Case(e, f).Default(g);

Если это вас интересует, я с удовольствием подготовлю пример

Ответ 4

Это невозможно в С#.

Ближайшим было бы либо переместить это в метод, либо выполнить назначение в каждом случае индивидуально, то есть:

int a;
switch(b)
{
 case c:
     a = d; break;
 case e:
     a = f; break;
 default:
     a = g; break;
};

Возможно ли это на любом другом языке?

Да. Например, большинство функциональных языков поддерживают что-то подобное. Например, F # соответствие шаблонов предоставляет (гораздо более мощную) версию этого.

Ответ 5

switch в С# - это оператор, который не имеет значения "return". Если вам интересно иметь выражение "switch", вы можете найти маленький свободный класс, который я написал здесь, чтобы иметь такой код:

a = Switch.On(b)
  .Case(c).Then(d)
  .Case(e).Then(f)
  .Default(g);

Вы можете пойти еще дальше и обобщить это еще больше с параметрами функции на методы Then.

Ответ 6

Нет.

Оператор

A switch обеспечивает управление ветвлением. Это не функция, которая оценивает то, что может быть назначено переменной.