使用未分配的局部变量错误的原因

时间:2012-09-03 12:15:07

标签: c#

我只是想知道为什么编译器会给我这个错误。每次调用函数时都会执行try块,这意味着将分配变量。但它仍然不让我编译。

using System;

namespace Checking
{
    class Program
    {
        static void Main(string[] args)
        {
            int intNum;
            intNum = readValue("Please enter a number: ");

        }
        static int readValue(string strPrompt)
        {
            int intRes;
            Console.WriteLine(strPrompt);
            try
            {
                intRes = Convert.ToInt32(Console.ReadLine());   // Gets assigned here! But still doesnt allow me to compile!

            }
            catch (Exception ex)
            {
                Console.WriteLine("Please enter a numeric value.\n");
                readValue(strPrompt);
            }
            return intRes;    
        }
    }
}

将try int块中的返回intRes放入允许我摆脱该错误,但随后出现错误,说不是所有代码路径都返回一个值。我理解错误,但我仍然不明白为什么它不允许我编译,每次都会执行try块吗?

我也知道为intRes分配0将消除该错误。

此致

5 个答案:

答案 0 :(得分:3)

因为如果尝试失败,则intRes没有值

在你的捕获中使用

intRes = readValue(strPrompt);

初始化它
int intRes = 0;

而不是

int intRes;

您可能还想查看int.TryParse语法

答案 1 :(得分:3)

如果Convert.ToInt32失败,intRes永远不会被分配到。

在创建变量时设置默认值,或在catch块中指定。

答案 2 :(得分:3)

编译器是对的。并不总是分配变量。

如果转换失败,则分配永远不会发生,并且在catch块内继续执行,再次调用该函数,但是您忘记将该调用的返回值赋给变量:

catch (Exception ex)
{
  Console.WriteLine("Please enter a numeric value.\n");
  intRes = readValue(strPrompt);
}

以下是使用whileTryParse

的替代实现
static int readValue(string strPrompt) {
  int intRes = 0;
  bool done = false;
  while (!done) {
    Console.WriteLine(strPrompt);
    if (Int32.TryParse(Console.ReadLine(), out intRes) {
      done = true;
    } else {
      Console.WriteLine("Please enter a numeric value.\n");
    }
  }
  return intRes;    
}

答案 3 :(得分:2)

如果intRes引发异常,您将获得未初始化的Console.ReadLine()。这就是你的编译器抱怨的原因。

答案 4 :(得分:1)

编译器无法知道try块中的代码是否会抛出异常 因此,如果您的代码抛出异常,则永远不会分配intRes变量。

因此编译器会发出错误消息。

另外,就目前而言,您的代码存在问题。您尝试在catch块内递归调用readValue以获取正确的值,但是当您的用户最终输入正确的值时,main将永远不会收到输入的值,因为您使用局部变量作为结果值。