Как преобразовать этот код с помощью выражений переключения и операций сравнения

#c# #.net

#c# #.net

Вопрос:

Я реализовал код, используя if …else .. Это работает правильно.

 public static byte GetLengthWithCascadedIfElse(int number)
        {
            if (number < 10 amp;amp; number > -10)
            {
                return 1;
            }

            if (number > 10 amp;amp; number < 100)
            {
                return 2;
            }
            if (number > 1000000 amp;amp; number < int.MaxValue)
            {
                return 3;
            }
            if (number < -100000000 amp;amp; number > -1000000000)
            {
                return 4;
            }

            return 10;
        }
 

Моя проблема в том, что мне нужно реализовать приведенный выше код, используя выражение переключения. Я пытался! Это не работает.

         public static byte GetLengthWithSwitchExpression(int number)
        {
            return number switch
            {
                _ when number == 0 amp;amp; number == -1 => 1,
                _ => throw new InvalidOperationException()
            };
        }
 

CS0266 не может неявно преобразовать тип ‘int’ в ‘byte’. Существует явное преобразование (вам не хватает приведения?)

Комментарии:

1. Это даже отдаленно не правильный синтаксис для оператора switch, не говоря уже c# о целом.. Вы пробовали читать документацию ?

2. @tnw Это C# 8 функция, которая называется switch expressions — документация . Ваша ссылка касается инструкции switch .

3. Обратите внимание, что значение number не может быть одновременно 0 и 1 одновременно; что проверяется _ when number == 0 amp;amp; number == -1 .

4. @pfx Моя ошибка! Спасибо

5. Функция в OP, скопированная / вставленная в тестовый проект, компилируется и работает просто отлично для меня. Я не вижу никаких причин для ошибки компиляции, которую вы перечисляете. Вы уверены, что OP содержит именно тот код, с которым у вас возникли проблемы?

Ответ №1:

Возможно, вы думаете о реляционных шаблонах C # 9?

 number switch
{
    > -10 and < 10 => 1,
    > 10 and < 100 => 2,
    > 1000000 and < int.MaxValue => 3, 
    > -1000000000 and < -100000000 => 4,
    _ => 10
};
 

Или C # 8 when ?

 number switch
{
    int a when a > -10 amp;amp; a < 10 => 1,
    int a when a > 10 amp;amp; a < 100 => 2,
    int a when a > 1000000 amp;amp; a < int.MaxValue => 3, 
    int a when a > -1000000000 amp;amp; a < -100000000 => 4,
    _ => 10
};
 

Похоже, что ваш удар при преобразовании использует совершенно другие параметры, чем то, что вы говорите, хотите / работает.. поэтому я не пытался преобразовать «случай 0 и 1»

Мне было интересно, является ли ваше «меньше, чем int.maxvalue» избыточным? Или у вас действительно будет передано максимальное значение, и вы хотите, чтобы оно было 10?

Комментарии:

1. Спасибо! Я использую c # 8. Я не знал, нужно ли добавлять дополнительную переменную ‘a’ (как в примере). И я исправляю значение int.maxvalue

2. Реляционные шаблоны не являются предварительным просмотром. C # 9 отсутствует уже более месяца

3. @Maxim Насколько я понимаю, он обычно используется для «сопоставления типов, которые предоставляют переменную этого типа для последующей проверки свойств», так что это похоже switch Shape (case) Triangle t when t.Hypotenuse > 2 — немного похоже if(someX is Triangle t amp;amp; t.Hypotenuse > 2 … Вся эта «проверка типа и возврат переменной этого типа», которую мы делаем, когда хотим написать код, который использует все, чего надеялся достичь полиморфизм 🙂

Ответ №2:

Преобразовать оператор if в оператор switch или выражение switch из visualstudio

Этот рефакторинг применяется к:

C # Что: преобразовать оператор if в оператор switch или в выражение переключения C # 8.0.

Когда: Вы хотите преобразовать оператор if в оператор switch или выражение switch и наоборот.

Почему: Если вы используете оператор if, этот рефакторинг позволяет легко перейти к операторам переключения или выражениям переключения.

Практическое руководство

1-Поместите курсор в ключевое слово if.

2-Нажмите Ctrl . чтобы вызвать меню быстрых действий и рефакторинга.

3-Выберите один из следующих двух вариантов:

Выберите команду Преобразовать в оператор ‘switch’. введите описание изображения здесь

Выберите Преобразовать в выражение ‘switch’. введите описание изображения здесь

Комментарии:

1. Спасибо. Я использовал этот инструмент другими способами. Именно в этом методе мне это не помогло