C# Передайте целочисленную переменную с необязательным значением по умолчанию - PullRequest
5 голосов
/ 09 марта 2020
class Program
{
    static void Main(string[] args)
    {
        WriteLine("What is the radius of your circle: ");
        WriteLine("The area of your circle is: " + 
            circleArea(Double.Parse(ReadLine())).ToString());
        ReadKey();
    }

    static double circleArea(double radius = 5.00)
    {            
        return Math.PI * (radius * radius);
    }
}

Я думал, что настроил правильно; Однако я получаю сообщение об ошибке System.FormatException: «Входная строка была в неправильном формате. в строке WriteLine("The area of your circle is: " + circleArea(Double.Parse(ReadLine())).ToString());, когда значение не введено. Я бы хотел, чтобы значение по умолчанию было 2. Спасибо.

Ответы [ 4 ]

6 голосов
/ 09 марта 2020

Ваша проблема в том, что вам нужно разделить преобразование, чтобы иметь возможность проверить наличие плохих условий ввода. Посмотрите на этот код.

            Console.WriteLine("What is the radius of your circle: ");
        var isNumber = Double.TryParse(Console.ReadLine(), out double number);
        if (!isNumber)
            number = 0;
        Console.WriteLine("The area of your circle is: " + circleArea(number).ToString());
        Console.ReadKey();

Это будет проверять на допустимое число, а если это не так, он просто пропускает ноль в качестве числа.

1 голос
/ 09 марта 2020

Double.Parse() всегда генерирует исключение FormatException, если входные данные не имеют форму допустимого двойного числа.

Поведение значений параметров по умолчанию заключается в том, что пропуск параметра при вызове метода заставит его вместо этого использовать значение по умолчанию (это делается путем вставки значения по умолчанию в вызов метода во время компиляции). Нет языкового поведения, которое позволяло бы автоматически заменять недопустимое значение каким-либо значением по умолчанию.

В вашем случае вам нужно выгрузить пустое значение, которое будет равно Double.Parse(). Как то так:

class Program
{
    static void Main(string[] args)
    {
        WriteLine("What is the radius of your circle: ");

        var input = ReadLine();

        if (!double.TryParse(input, out var value))
            WriteLine($"Invalid input received: {value}");
        else
            WriteLine("The area of your circle is: " + circleArea(value).ToString());

        ReadKey();
    }
    static double circleArea(double radius = 5.00)
    {            
        return Math.PI * (radius * radius);
    }
}
0 голосов
/ 09 марта 2020

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

        Console.Write("What is the radius of your circle: ");
        var value = double.TryParse(Console.ReadLine(), out var input) ? input : 2d;
        Console.WriteLine($"The area of your circle is {circleArea(value)}");
0 голосов
/ 09 марта 2020

Я бы настоятельно рекомендовал выполнить чтение и вычисление в два этапа

class Program
{
    static void Main(string[] args)
    {
        WriteLine("What is the radius of your circle: ");
        var input = ReadLine();
        double d = 0.0;

        if(!Double.TryParse(input,out d)) {
            d = //default value here
        }

        WriteLine("The area of your circle is: " + circleArea(d).ToString());
        ReadKey();
   }

}

...