0

我只是想知道为什么编译器会给我这个错误。每次调用函数时都会执行 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;    
        }
    }
}

将 return intRes 放在 try 块中可以让我摆脱该错误,但随后会出现一个错误,指出并非所有代码路径都返回一个值。我理解错误,但我仍然不明白为什么它不允许我编译,try 块每次都会执行对吗?

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

问候,

4

5 回答 5

3

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

在您的捕获中使用

intRes = readValue(strPrompt);

初始化它

int intRes = 0;

代替

int intRes;

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

于 2012-09-03T12:16:17.980 回答
3

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

在创建变量时设置默认值,或者在catch块中分配给。

于 2012-09-03T12:16:19.027 回答
3

编译器是对的。变量并不总是被赋值。

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

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

while这是使用and的替代实现TryParse

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;    
}
于 2012-09-03T12:18:39.853 回答
2

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

于 2012-09-03T12:18:59.133 回答
1

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

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

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

于 2012-09-03T12:17:20.203 回答