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

あなたのキャッチでは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 に答える
0

ifブロック内のブロックには return ステートメントがありませんcatch。したがって、ループの本体は実行されると想定されます。これは、while条件も実行されることを意味するため、コンパイラはそれが false を返す可能性があると想定します。whileこれは、ステートメントの後に return も必要であることを意味します。

于 2013-08-07T23:44:10.830 に答える