“使用未分配的局部变量”错误用于三个局部变量,但不用于第四个局部变量。为什么?

时间:2017-03-30 15:28:24

标签: c#

对于C#中的以下代码,为什么会出现错误: -

  

错误1:使用未分配的局部变量circleArea
  错误2:使用未分配的局部变量circleRadius
  错误3:使用未分配的局部变量circleDiameter

但不适用于paramaterChoice;即使它也是一个未初始化的局部变量?

static void Main(string[] args)
{
    char paramaterChoice;
    double circleRadius, circleDiameter, circleArea;
    const double PI=3.14;

    Console.WriteLine("If you know the radius press r or R, If you know the diameter press d or D");
    paramaterChoice = Convert.ToChar(Console.ReadLine());

    switch (paramaterChoice)
    {
        case 'r':
        case 'R':
            Console.WriteLine("Enter the Radius of the Circle");
            circleRadius = Convert.ToDouble(Console.ReadLine());
            circleArea = PI * circleRadius * circleRadius;
            //Console.WriteLine("Area of Cirle is: {0:f2}", circleArea);
            break;
        case 'd':
        case 'D':
            Console.WriteLine("Enter the Diameter of the Circle");
            circleDiameter = Convert.ToDouble(Console.ReadLine());
            circleArea = PI * circleDiameter * circleDiameter / 4;
            //Console.WriteLine("Area of Cirle is: {0:f2}", circleArea);
            break;
    }

    // The error occurs on the next line:
    Console.WriteLine("Parameter: {0}, Radius: {1:f2}, Diameter: {2:f2}, Area: {3:f2}",
        paramaterChoice, circleRadius, circleDiameter, circleArea);

    Console.WriteLine("\nProgram Info: Calculates the Area of a circle");        
}

2 个答案:

答案 0 :(得分:2)

你的问题在这里:

Console.WriteLine("Radius: {0:f2}, Diameter: {1:f2}, Area: {2:f2}", circleRadius, circleDiameter, circleArea);

这些值仅在switch语句中指定,并且仅在它们输入您的可选值之一时才会指定。 (rRdD)。

这意味着如果没有其中任何一个进入,那么......

因此,要解决此问题,请将值设置为0以开始:

double circleRadius = 0, circleDiameter = 0, circleArea = 0;

或使用

处理switch语句中的值
default:
//Set values here.
break;

default基本上意味着if neither of these was entered

答案 1 :(得分:1)

正如其他人所说,您收到错误的原因是,在您使用它们之前,并非所有值都已分配。因此,您需要在声明它们时初始化它们,或者确保在每个case语句中分配这两个值(并包含一个分配它们的默认语句)。

如果用户没有为半径/直径输入输入有效的double,则还有一个问题。我喜欢从用户收集强类型信息的方法是编写接收提示字符串并返回您期望的强类型的方法。然后,在该方法中,保持循环直到用户输入有效值。

例如:

/// <summary>
/// Gets a strongly typed (double) value from the Console
/// </summary>
/// <param name="prompt">The initial message to display to the user</param>
/// <returns>User input converted to a double</returns>
private static double GetDoubleFromUser(string prompt)
{
    double value;

    // Write the prompt text and get input from user
    Console.Write(prompt);
    string input = Console.ReadLine();

    // If input can't be converted to a double, keep trying
    while (!double.TryParse(input, out value))
    {
        Console.Write($"'{input}' is not a valid number. Please try again: ");
        input = Console.ReadLine();
    }

    // Input was successfully converted!
    return value;
}

然后,您可以在代码中使用它,如下例所示。请注意,我还做了一些其他更改:

  1. 使用ReadKey获取用户输入。这会读取他们按下的键,你不必担心比较大写或小写。
  2. switch个案例中设置用户未输入的项目的值(半径或直径)。
  3. 使用内置的Math属性/方法来获取PI并使半径“平方”。
  4. 如果用户未输入boolexit,则将名为R的{​​{1}}变量设置为true,然后在显示任何内容之前检查其值输出(这样我们就不会显示他们没有输入的输出,并允许用户以简单的方式退出)。
  5. 例如:

    D