Установка переменной для результата коммутатора - PullRequest
13 голосов
/ 16 ноября 2011

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

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

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

Ответы [ 7 ]

23 голосов
/ 16 ноября 2011

Нет, switch является выражением, а не выражением, которое может быть оценено.

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

int x = DoSwitch(y);

...

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

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

12 голосов
/ 16 ноября 2011

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

var a = b == c ? d:
        b == e ? f:
                 g;
6 голосов
/ 16 ноября 2011

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

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

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

6 голосов
/ 16 ноября 2011

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

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

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

3 голосов
/ 16 ноября 2011

switch в C # - это оператор, который не имеет возвращаемого значения. Если вам интересно иметь выражение «switch», вы можете найти небольшой беглый класс, который я написал здесь , чтобы иметь такой код:

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

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

1 голос
/ 16 февраля 2018

Я хотел то же самое, потому что я довольно часто использую Ruby, и это позволяет вам делать такие вещи. Поэтому я создал пакет nuget с именем FluentSwitch .

1 голос
/ 16 ноября 2011

No.

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

...