Оператор переключения C # 8.0 с недействительным

Я получаю следующую ошибку: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement

public void LogClientSideErrors(string message, ValidationType validationType)
        => validationType switch
            {
                ValidationType.Success => setInfo(message, controllerInfo),
                ValidationType.Critical => setFatal(message, controllerInfo),
                ValidationType.Error => setError(message, controllerInfo),
                ValidationType.Exception => setError(message, controllerInfo),
                ValidationType.Information => setInfo(message, controllerInfo),
                ValidationType.Warning => setWarn(message, controllerInfo),
                _ => setError("invalid enum value", controllerInfo),
            }; 

Обновление: Рабочее решение:

internal static void GenerateLogs(string message, string controllerInfo, ValidationType validationType)
        => (validationType switch
        {
            var x when x == ValidationType.Success || x == ValidationType.Information => new Action<string, string>(setInfo),
            ValidationType.Critical => setFatal,
            var x when x == ValidationType.Error || x == ValidationType.Exception => setError,
            ValidationType.Warning => setWarn,
            _ => (_, controllerInfo) => setError("invalid enum value", controllerInfo),
        })(message, controllerInfo);

person Muhammad Hammad Maroof    schedule 11.08.2020    source источник
comment
Выражения переключения - это выражения: они должны возвращать значение. Вам, вероятно, будет лучше использовать обычный оператор switch. Таким образом, вы также можете сгруппировать свои дела, например case ValidationType.Success: case ValidationType.Information: setInfo(message, controllerInfo); break;   -  person canton7    schedule 11.08.2020
comment
Вот как я сгруппировал случаи: переключатель validationType {ValidationType.Critical = ›setFatal (message, controllerInfo), ValidationType.Exception | ValidationType.Error = ›setError (message, controllerInfo), ValidationType.Information | ValidationType.Success = ›setInfo (сообщение, controllerInfo), ValidationType.Warning =› setWarn (message, controllerInfo), _ = ›setError (недопустимое значение перечисления, controllerInfo),};   -  person Muhammad Hammad Maroof    schedule 11.08.2020
comment
Это не то, что вы думаете. Это не соответствует исключению или ошибке, он выполняет двоичное ИЛИ исключения и ошибки, а затем проверяет, равно ли validationType этому. Точно так же, как спросить validationType == (ValidationType.Exception | ValidationType.Error)   -  person canton7    schedule 11.08.2020


Ответы (1)


Выражение switch ожидает, что вы вернете что-то из каждой ветки, но вы пытаетесь запустить методы void. Вы можете либо заставить эти методы что-то возвращать, использовать обычный переключатель, либо вы можете вернуть Action<string, string>, а затем вызвать его, например.

public void LogClientSideErrors(string message, ValidationType validationType)
    => (validationType switch
        {
            ValidationType.Success => new Action<string, string>(setInfo),
            ValidationType.Critical => setFatal,
            ValidationType.Error => setError,
            ValidationType.Exception => setError,
            ValidationType.Information => setInfo,
            ValidationType.Warning => setWarn,
            _ => (_, ci) => setError("invalid enum value", ci),
        })(message, controllerInfo);
person juharr    schedule 11.08.2020
comment
Почти, но не совсем. Вам нужны скобки вокруг validationType switch { ... }, и вам нужно сообщить компилятору, что такое тип делегата. Смотрите здесь - person canton7; 11.08.2020
comment
controllerInfo - это строка. Спасибо, что помогли мне. Я изменил тип возврата, и это сработало. Я попробовал исправление, которое вы предоставили, но оно дало следующую ошибку: сообщение и информация о контроллере не завершаются в текущем контексте (перефразированном), можете ли вы поделиться более подробной информацией о реализации или ссылкой для подражания, поскольку я очень хочу узнать об этом больше. - person Muhammad Hammad Maroof; 11.08.2020
comment
@MuhammadHammadMaroof Как упоминалось в conton7, на самом деле для этого нужны скобки вокруг всего выражения переключателя, и ему нужен один из параметров для определения типа Action. - person juharr; 11.08.2020