16

私はこの簡単なコードを持っています:

public static int GetInt(int number)
{
    int[] ints = new int[]{ 3, 7, 9, int.MaxValue };
    foreach (int i in ints)
        if (number <= i)
            return i;

    return int.MaxValue; //this should be unreachable code since the last int is int.MaxValue and number <= int.MaxValue is allways true so the above code will allways return
}

問題は、すべての実行パスが値を返すとは限らないとコンパイラが言うことです。そのため、到達することのないコードを書かなければなりません。私の質問は、このような状況ではどうすればよいですか? デフォルト値を返すか、例外をスローする必要があります。また、例外をスローしたい場合、スローするのに適した例外は何ですか? のようなものは見つかりませんでしたUnreachableCodeException

4

7 に答える 7

11

の後に論理エラー メッセージを表示するには、次を使用しますforeach

System.Diagnostics.Debug.Fail("Unreachable code reached");

これにより、デバッグ中に警告が表示されます。

さらに、生産中の例外もスローします。

throw new InvalidOperationException();

値、特に潜在的に有効な値を返すだけではいけません。論理エラーをキャッチすることはできません。

于 2013-06-06T15:53:56.977 に答える
5

ループから戻るのではなく、戻り値変数を宣言して設定し、コードの最後で 1 回戻ります。

public static int GetInt(int number)
{
    var rtnVal = int.MaxValue;
    int[] ints = new int[]{ 3, 7, 9, int.MaxValue };
    foreach (int i in ints) {
        if (number <= i) {
            rtnVal = i;
            break;
        }
    }
    return rtnVal;
}
于 2013-06-06T15:49:37.600 に答える
3

一致が見つからない場合に自動的に例外をスローする LINQ オプションを次に示します。

public static int GetInt(int number)
{
    int[] ints = new int[]{ 3, 7, 9, int.MaxValue };
    return ints.First(i => number <= i);
}
于 2013-06-06T15:52:21.767 に答える
0

代わりに数値より大きい最初の値を返さない理由

    public static int GetInt(int number)
    {
        var ints = new[] { 3, 7, 9};
        return (ints.Any(i => i > number))? 
            ints.First(i => i > number): int.MaxValue;
    }
于 2013-06-06T18:52:17.403 に答える
0

コンパイラは、foreachループが常に値を返すことを認識できません。

原理的には情報が利用可能であるため、理論的なコンパイラはそうすることができますが、C# コンパイラはそうすることができません。

于 2013-06-06T15:47:25.380 に答える