2
public static Boolean CanParseStringToInt(String s)
    {
        Boolean retry = false;
        int n = 0;

        do
        {
            try
            {
                n = int.Parse(s);
                return true;
            }
            catch (Exception ex)
            {
                if (!retry)
                {
                    retry = true;
                }
                else
                {
                    return false;
                }
            }
        }
        while (retry);
    }

我的目标是 .Net 4.0 并使用 VS2012。代码只是一个例子。

4

5 回答 5

3

编译器不能绝对判断一段代码是否最终会返回一个值。看看停机问题,看看这个困难的例子。

如果你像这样重组代码,它的行为应该相同,但会修复错误:

public static Boolean CanParseStringToInt(String s)
{
    Boolean retry = false;
    int n = 0;

    do
    {
        try
        {
            n = int.Parse(s);
            return true;
        }
        catch
        {
            if (!retry)
            {
                retry = true;
            }
            else
            {
                break;
            }
        }
    }
    while (retry);

    return false;
}
于 2013-08-07T23:44:22.563 回答
2

编译器不够聪明,无法知道您最终将返回循环内部。

我会在方法的末尾添加这一行:

throw new InvalidOperationException("Should not have reached here.");
于 2013-08-07T23:45:34.363 回答
1

while循环后您没有返回任何内容。

不确定此方法的用途,但我建议Int32.TryParse()不要使用此实现。

于 2013-08-07T23:42:10.597 回答
0

if块内的块中没有返回语句catch。因此,假设循环体被执行。这意味着while条件也会执行,因此编译器假定它可以返回 false。while这意味着在语句之后还必须有一个返回

于 2013-08-07T23:44:10.830 回答
0

在您的 catch 中,else 条件返回但 if 没有返回,而是进行赋值。在你的时间之外也没有回报。

       catch (Exception ex)
        {
            if (!retry)
            {
                retry = true;
            }
            else
            {
                return false;
            }
        }

一般来说,我更喜欢编写如下所示的重试逻辑;

 for (int i = 0; i < retries; i++)
 {
     try
     {
         //do stuff that could throw
     }
     catch (Exception e)
     {
         Thread.Sleep(500);
         if (i == retries - 1)
         {
             throw new Exception(e.Message);
         }
     }
  }

此外,在再次查看您的代码后,您似乎正在编写int.TryParse(string input, out int output)

于 2013-08-07T23:44:39.337 回答