Попытка использовать оператор switch вместо if, чтобы узнать, какое значение больше или меньше - PullRequest
0 голосов
/ 20 ноября 2018

Я новичок в изучении c # (и любого языка программирования). Я пытаюсь использовать оператор switch вместо , если еще .

.если оператор else

  private void RunScript(int a, int b, ref object A)
  {
    if (a < b)
    {
      Print("a is smaller than b");
      Print("b is bigger than a");
    }
    else if (a > b)
    {
      Print("a is bigger than b");
      Print("b is smaller than a");
    }
    else
    {
      Print("a equals b");
    }

, это то, что я пытаюсь сделать

 private void RunScript(double a, double b, ref object A)
      {
        double whichIsBigger = a - b;
//below is the 58th line
        switch (whichIsBigger)
        {
          case whichIsBigger < 0:
            Print("a is bigger than b");
            break;
          case whichIsBigger > 0:
            Print("a is smaller than b");
            break;
          default:
            Print("a equals b");
            break;
        }

Это дает мне эту ошибку (CS0151): выражение переключателя или метка case должны быть bool, символ, строка, интеграл, перечисление или соответствующий обнуляемый тип (строка 58)

К вашему сведению, я пытаюсь сделать это на rhinoceros3d, используя общую библиотеку rhino.

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

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

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

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

switch (a < b)
{
    case true:
        // do some stuff
        break;
    case false:
        switch (a > b)
        {
            case true:
                // do other stuff
                break;
            case false:
                // do other other stuff
                break;
        }
        break;
 }

, но вы не можете делать прямые сравнения в операторе case, потому что они уже проводят сравнение со значением, которое вы передали в исходный switch.

Кроме того, вышеупомянутый пример - плохой вариант использования для switch, так как он был бы лучше обработан if-else.Если ваша цель - понять switch, мой совет - попытаться преобразовать enum в какой-либо другой тип, основанный на его значениях:

public enum Color
{
    Red,
    Blue,
    Green,
}

public string ConvertToHexWithIfElse(Color myColor)
{
    if (myColor == Color.Red)
    {
        return "#FF0000";
    }
    else if (myColor == Color.Green)
    {
        return "#00FF00";
    }
    else if (myColor == Color.Blue)
    {
        return "#0000FF";
    }

    return string.Empty;
}

public string ConvertToHexWithSwitch(Color myColor)
{
    switch (myColor)
    {
        case Color.Red:
            return "#FF0000";
        case Color.Blue:
            return "#0000FF";
        case Color.Green:
            return "#00FF00";
        default:
            return string.Empty;
    }
}

Обратите внимание, что даже этот примерв некоторой степени плохо используется switch, потому что enum был вынужденным устройством, используемым просто для демонстрации использования.Переключатель IMHO практически не используется: вы либо используете словарь, либо используете if-else.

0 голосов
/ 20 ноября 2018

При выполнении оператора switch каждый «case» не должен иметь условного выражения.Операторы switch предназначены для «переключения» значений.Как, например, замена цветов!

Color c = (Color) (new Random()).Next(0, 3);
switch (c)
{
    //Value of "c" is red
    case Color.Red:
       Console.WriteLine("Red!");
       break;
    //Value of "c" is green
    case Color.Green:
       Console.WriteLine("Green!");
       break;
    //Value of "c" is blue
    case Color.Blue:
       Console.WriteLine("Blue!");   
       break;
    //"c" is not red, green, or blue, so we default our message to say the color is unknown!
    default:
       Console.WriteLine("The color is not known.");
       break;   
}

В каждом «случае» мы видим, является ли «c» конкретным значением, и если нет, в нашем операторе switch есть значение по умолчанию для обработки сценария.

0 голосов
/ 20 ноября 2018

По сути, вы пытаетесь выполнить оценку в вашем case утверждении.Вы должны выполнить оценку раньше и использовать значения в вашем case утверждении.

Если это ситуация true / false, вы не должны использовать switch.Переключатель, как правило, для случаев, когда есть несколько вариантов, которые могут быть правдой.Например, если у вас было enum с несколькими значениями, и вы хотите сделать что-то другое для каждого значения (например, DayOfWeek.Monday, DayOfWeek.Tuesday и т. Д.).Именно по этой причине вы столкнулись здесь.

Если вы действительно хотите, вы можете создать перечисление ABCompare.Bigger, ABCompare.Smaller, ABCompare.Equal или что-то в этом роде, а затем switch наэто - но это не имеет смысла.

...