Несколько операторов в выражении переключателя c# 8 - PullRequest
3 голосов
/ 24 января 2020

Выражение переключателя было введено в C# 8. В кодовой базе есть много мест, которые могут быть переписаны в новом стиле.

Итак, у меня есть некоторый код, который используется для разбора пакетов из байтов stream:

switch (command)
{
case Command.C1:
    return new P1();
case Command.C2:
    return new P2();
default:
    stream.Position++;
    return null;
}

Проблема в том, что его нельзя преобразовать для переключения выражения следующим образом

return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => { stream.Position++; return null; }
};

Первое, что мне пришло в голову, - это использовать Fun c, и он компилируется:

return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => new Func<AbstractPacket>(() => { stream.Position++; return null; })()
};

F # уже позволяет писать код с несколькими операторами в каждой ветви:

match command with
| Command.C1 -> Some(P1() :> AbstractPacket)
| Command.C2 -> Some(P2() :> AbstractPacket)
| _ ->
    stream.Position <- stream.Position + 1
    None

Теперь я придерживаюсь использования оператора switch, но есть ли возможность написать это как выражение-выражение без каких-либо странных хаков?

1 Ответ

2 голосов
/ 24 января 2020

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

var result = operation switch
{
"+" => ((Func<int>)(() => {
    Log("addition");
    return a + b;
}))(),
"-" => ((Func<int>)(() => {
    Log("subtraction");
    return a - b;
}))(),
"/" => ((Func<int>)(() => {
    Log("division");
    return a / b;
}))(),
_ => throw new NotSupportedException()
};

То, что он новый, не означает, что он лучший для всех сценариев использования ios. Он не предназначен для нескольких команд.

...