Возможно непреднамеренное сравнение ссылок в C #

1

Я получаю возможное непреднамеренное сравнение ссылок; чтобы получить сравнение значений, введите левую сторону для ввода "string" в операторах if в методе GetPrice. Он показывает его выделение на всех операциях if (size == "Small"). Вот мои переменные:

drinkType = GetDrinkType();
size = GetDrinkSize();
price = GetPrice(size);

private string GetDrinkType()
        {
            string theDrink;
            theDrink = "None Selected";

            if (rdoCoffee.Checked)
            {
                theDrink = "Coffee";
            }
            else if (rdoCoco.Checked)
            {
                theDrink = "Hot Chocolate";
            }
            else if (rdoSmoothie.Checked)
            {
                theDrink = "Smoothie";
            }

            return theDrink;
        }

        private string GetDrinkSize()
        {
            string theSize;
            theSize = "None Selected";

            if (rdoSmall.Checked)
            {
                theSize = "Small";
            }
            else if (rdoMedium.Checked)
            {
                theSize = "Medium";
            }
            else if (rdoLarge.Checked)
            {
                theSize = "Large";
            }
            return theSize;
        }
        private decimal GetPrice(object size)
        {
            decimal thePrice;
            thePrice = 0;
            if (size == "Small")
            {
                thePrice = 1.25m;
            }
            else if (size == "Medium")
            {
                thePrice = 2.50m;
            }
            else if (size == "Large")
            {
                thePrice = 3.35m;
            }
            return thePrice;
        }
Теги:
methods
variables

4 ответа

3

Параметр size объявляется для object типа, поэтому компилятор не знает его на самом деле типа string. Таким образом, он использует равенство по умолчанию для object type, которое является эталонным сравнением.

Если вы измените тип size на string, он будет использовать перегрузку оператора равенства из класса string, который выполняет сравнение значений.

private decimal GetPrice(string size)
  • 0
    Спасибо! Это сработало!
  • 0
    Быстрый ответ на вопрос. Будет ли приведение объекта в виде строки все равно выдать ошибку, или компилятор не достигнет этого уровня?
Показать ещё 1 комментарий
1

Попробуйте изменить "объект" в GetPrice на "string".

  • 0
    Это также сработало, и я думаю, что так лучше. Спасибо!
1

Предупреждение возникает, потому что вы сравниваете строку с объектом. Если вы меняете

 if (size == "Small")

в

 if (size.ToString() == "Small")

предупреждение будет удалено.

  • 0
    Это сработало, спасибо! Я думаю, я не осознавал, что я это делал.
0

Поскольку в GetPrize тип size является object, но вы сравниваете его со string с size == "Large".

Измените сравнение со "string text".Equals(object) как показано ниже

private decimal GetPrice(object size)
{
      decimal thePrice = 0m;
      if ("Small".Equals(size))
      {
            thePrice = 1.25m;
      }
      else if ("Medium".Equals(size))
      {
            thePrice = 2.50m;
      }
      else if ("Large".Equals(size))
      {
            thePrice = 3.35m;
      }
      return thePrice;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню