#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. Спасибо. Я использовал этот инструмент другими способами. Именно в этом методе мне это не помогло