Как я могу применить операнд `|` к строке? - PullRequest
0 голосов
/ 14 апреля 2020

У меня проблемы с этой строкой кода прямо здесь ... почему я получаю сообщение об этой ошибке? Я получаю сообщение об ошибке: "Operator '|' cannot be applied to operands of type 'bool' and 'string' Как проверить, не совпадает ли моя переменная резидентности с этими двумя строками, которые я перечислил в операторе if?

catch (ArgumentException)
            {
                if (age > 16 | age > 80)
                {
                    Console.WriteLine("You can only enter states of OH or MI ad the driver's age must be between 16 and 80.");
                }
                if (residency != "OH" | "MI")
                {
                    Console.WriteLine("You can only enter states of OH or MI ad the driver's age must be between 16 and 80.");
                }
            }

Вот полный код, если вы хотите получить лучшее представление о том, что я пытаюсь выполнить.

class Program
    {
        static void Main(string[] args)
        {
            CarInsurance create = new CarInsurance();
            Console.Write("Enter the age of the driver: ");
            int age = Convert.ToInt32(Console.ReadLine());
            Console.Write("Enter the state the driver lives in: ");
            string residence = Convert.ToString(Console.ReadLine());
            create.PremiumCalculate(age, residence);
        }
    }
    class CarInsurance
    {
        public int driverAge { get; set; }
        public string residency { get; set; }
        public int totalPremium;

        public int GetPremium()
        {
            return totalPremium;
        }
        public void PremiumCalculate(int age, string residency)
        {
            int premiumOhio = 100;
            int premiumMichigan = 250;
            try
            {
                if (residency == "MI")
                {
                    int total = (100 - age) * 3 + premiumMichigan;
                    Console.WriteLine("Your premium is {0}", total.ToString("C"));
                }
                if (residency == "OH")
                {
                    int total = (100 - age) * 3 + premiumOhio;
                    Console.WriteLine("Your premium is {0}", total.ToString("C"));
                }
            }
            catch (ArgumentException)
            {
                if (age > 16 | age > 80)
                {
                    Console.WriteLine("You can only enter states of OH or MI ad the driver's age must be between 16 and 80.");
                }
                if (residency != "OH" | "MI")
                {
                    Console.WriteLine("You can only enter states of OH or MI ad the driver's age must be between 16 and 80.");
                }
            }
        }
    }

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

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

if (residency != "OH" || residency != "MI")

Обратите внимание, однако, что это условие всегда будет возвращать true. Вы, вероятно, хотели использовать &&:

if (residency != "OH" && residency != "MI")
1 голос
/ 14 апреля 2020

Как насчет этого? Сначала я перечисляю все штаты (да, вас волнуют только два из них, но любое из них является действительным):

public enum ResidentState
{
    AL,
    AK,
    AZ,
    AR,
    CA,
    CO,
    CT,
    DE,
    FL,
    GA,
    HI,
    ID,
    IL,
    IN,
    IA,
    KS,
    KY,
    LA,
    ME,
    MD,
    MA,
    MI,
    MN,
    MS,
    MO,
    MT,
    NE,
    NV,
    NH,
    NJ,
    NM,
    NY,
    NC,
    ND,
    OH,
    OK,
    OR,
    PA,
    RI,
    SC,
    SD,
    TN,
    TX,
    UT,
    VT,
    VA,
    WA,
    WV,
    WI,
    WY,
}

Затем я начинаю свой класс страхования автомобилей:

class CarInsurance
{
    public int DriverAge { get; private set; }
    public ResidentState Residency { get; private set; }
    public int TotalPremium { get; private set; }

    private bool _ageOk = false;
    private bool _residencyOk = false;
}

Имеет общедоступные свойства для DriverAge, ResidentState и TotalPremium. Они могут быть установлены только из класса. Он также имеет несколько флагов учета для возраста и срока действия резидентности.

Затем я добавляю пару функций-членов в этот класс для установки DriverAge и Residency. Они делают проверку ошибок. У них обоих одинаковый рисунок. Они вернут false, если вы не установите их правильно:

 public bool SetResidency(ResidentState residency)
 {
     if (residency != ResidentState.OH && residency != ResidentState.MI)
     {
         Console.WriteLine("You can only enter states of OH or MI");
         return false;
     }

     Residency = residency;
     _residencyOk = true;
     return true;
 }

 public bool SetDriverAge(int age)
 {
     if (age < 16 || age > 80)
     {
         Console.WriteLine("The driver's age must between 16 and 80.");
         return false;
     }

     _ageOk = true;
     DriverAge = age;
     return true;
 }

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

Затем я создаю функцию CalculatePremium для этого класса (и нескольких констант) (обратите внимание, я переименовал ее в существительное глагола, я думаю, что это имеет больше смысла):

private const int PremiumOhio = 100;
private const int PremiumMichigan = 250;

public int CalculatePremium()
{
    if (!_residencyOk)
    {
        throw new ArgumentException("The driver's residency must first be entered, and only Ohio and Michigan are valid states");
    }

    if (!_ageOk)
    {
        throw new ArgumentException("The driver's age must first be entered, and it must be between 16 and 80");
    }

    int premium;
    switch (Residency)
    {
        case ResidentState.MI:
            premium = PremiumMichigan;
            break;
        case ResidentState.OH:
            premium = PremiumOhio;
            break;
        default:
            premium = 10_000;
            break;
    }

    TotalPremium = (100 - DriverAge) * 3 + premium;
    Console.WriteLine($"Your total premium is {TotalPremium:C}");
    return TotalPremium;
}

Наконец, я написал класс Program, который имеет функцию Main:

class Program
{
    static void Main(string[] args)
    {
        CarInsurance insurance = new CarInsurance();
        bool ageOk = false;
        do
        {
            Console.Write("Enter the age of the driver: ");
            var response = Console.ReadLine();
            ageOk = int.TryParse(response, out var age);
            if (!ageOk)
            {
                Console.WriteLine("You must enter an integer for age");
            }
            else
            {
                ageOk = insurance.SetDriverAge(age);
            }
        } while (!ageOk);

        bool stateOk = false;
        do
        {
            Console.Write("Enter the state the driver lives in: ");
            var stateStr = Console.ReadLine();
            stateOk = Enum.TryParse<ResidentState>(stateStr, true, out var state);
            if (!stateOk)
            {
                Console.WriteLine($"The state you entered ({stateStr}) is not a valid two-letter state abbreviation");
            }
            else
            {
                stateOk = insurance.SetResidency(state);
            }

        } while (!stateOk);

        var premium = insurance.CalculatePremium();
    }
}

Обратите внимание, что я проверяю, что введенные данные являются действительным целым числом (или действительным сокращением состояния) в этом код. Затем я проверяю (используя класс страхования), что он действителен для этого расчета. Как написано, это не приведет к выбрасыванию ни одного из исключений в CalculatePremium. Тем не менее, может иметь смысл заключить вызов CalculatePremium в попытку / улов. Я оставлю это на ваше усмотрение - вам действительно нужно прочитать об исключениях.

Я написал, что это способ (и объяснил это в некотором смысле), который позволит вам изучить некоторые особенности язык. Пройдите через это в отладчике. Введите недопустимые записи для обеих величин (что-то, что не является целым числом, а затем что-то, что находится за пределами диапазона по возрасту, и что-то, что не является состоянием, а затем не MI или OH) и посмотрите, что произойдет. Попробуйте вызвать функцию расчета премии с недопустимыми значениями и посмотрите, что произойдет (и попытайтесь поймать результат).

1 голос
/ 14 апреля 2020

Позвольте мне сначала объяснить проблему. Здесь residency != "OH" | "MI", вы оцениваете residency != "OH", и это работает и производит bool. Затем сгенерированный bool завершается с ошибкой | "MI", потому что оператор | недопустим для строк.

Если бы у вас было 2 строки, вы бы получили

Оператор '|' не может применяться к операндам типа 'string' и 'string'

Один из способов исправить это

using System.Linq;
. . .. 
var exclusionList = new [] {"OH","MI"};
if (!exclusionList.Contains(residency)) 
...