【问题标题】:C# Pass an integer variable with an optional default valueC# 传递一个带有可选默认值的整数变量
【发布时间】:2020-03-09 20:19:20
【问题描述】:
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。谢谢。

【问题讨论】:

  • Double.Parse(...) 需要该值。如果您可能不传递值,则应使用 Double.TryParse(...)
  • @PavelAnikhouski - OP 说“当没有输入任何值时”,所以我假设他们只是按 Enter 键。
  • 你必须使用 Double.TryParse()。如果输入有效,则返回 true,否则返回 false...
  • @PavelAnikhouski - OP 说“当没有输入值时”,所以我假设他们只是按 Enter 键。 --- 是的,用户会按下回车键
  • WriteLine("The area of your circle is: " + circleArea(Double.TryParse(ReadLine(), out var value) ? value : 2).ToString());

标签: c# default optional


【解决方案1】:

您的问题是您需要拆分转换才能测试错误的输入条件。看看这段代码。

            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();

这将测试一个合法的数字,如果不是,它只是将零作为数字传递。

【讨论】:

    【解决方案2】:

    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);
        }
    }
    

    【讨论】:

    • 感谢您的评论。我正在寻找要处理的默认值 (5),而不是空白或未输入值。
    【解决方案3】:

    这是一种测试输入的简洁方法,如果输入的格式不正确,则选择默认值。

            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)}");
    

    【讨论】:

      【解决方案4】:

      我强烈建议分两步进行阅读和计算

      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();
         }
      

      }

      【讨论】:

      • 我认为即使尝试失败,out 也会将他的默认值重置为零。
      猜你喜欢
      • 2022-01-14
      • 2017-05-20
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多