web-dev-qa-db-ja.com

c#「すべてのコードパスが値を返すわけではない」というエラーを返す

私は、与えられた整数が1から20で割り切れるかどうかを返すコードを書こうとしています。
しかし、次のエラーが引き続き表示されます。

エラーCS0161: 'ProblemFive.isTwenty(int)':すべてのコードパスが値を返すわけではありません

ここに私のコードがあります:

public static bool isTwenty(int num)
{
    for(int j = 1; j <= 20; j++)
    {
        if(num % j != 0)
        {
            return false;
        }
        else if(num % j == 0 && num == 20)
        {
            return true;
        }
    }
}
37
user115185

returnステートメントがありません。

コンパイラがコードを見ると、発生する可能性があるが値を返さない3番目のパス(else)が表示されます。したがってnot all code paths return a value

修正案として、ループが終了した後にreturnを追加します。他の明らかなスポット-else値を持つreturnif-else-ifに追加すると、forループが壊れます。

public static bool isTwenty(int num)
{
    for(int j = 1; j <= 20; j++)
    {
        if(num % j != 0)
        {
            return false;
        }
        else if(num % j == 0 && num == 20)
        {
            return true;
        }
    }
    return false;  //This is your missing statement
}
75
GlenH7

コンパイラーは、ループの最後の反復で戻る複雑なロジックを取得しないため、ループを終了して、何も返さないことが考えられます。

最後の反復で戻る代わりに、ループの後にtrueを返すだけです。

public static bool isTwenty(int num) {
  for(int j = 1; j <= 20; j++) {
    if(num % j != 0) {
      return false;
    }
  }
  return true;
}

サイドノート、元のコードに論理エラーがあります。最後の条件でnum == 20かどうかを確認していますが、j == 20かどうかを確認する必要があります。また、num % j == 0がスーパーフロースであったかどうかを確認します。

8
Guffa

私もこの問題を経験し、簡単な解決策を見つけました

public string ReturnValues()
{
    string _var = ""; // Setting an innitial value

    if (.....)  // Looking at conditions
    {
        _var = "true"; // Re-assign the value of _var
    }

    return _var; // Return the value of var
}

これは、他の戻り値の型でも機能し、最小限の問題を与えます

選択した初期値はフォールバック値であり、必要な回数だけ値を再割り当てできました。

6
Evert

または単にこのことを行う:

public static bool isTwenty(int num)
{
   for(int j = 1; j <= 20; j++)
   {
      if(num % j != 0)
      {
          return false;
      }
      else if(num % j == 0 && num == 20)
      {
          return true;
      }
      else
          return false; 
      }

}
3
DareDevil

私は死んだ馬を打ち負かすのが好きですが、私はただ追加のポイントを作りたかっただけです。

まず、問題は、制御構造のすべての条件が対処されていないことです。本質的に、あなたはaなら、これなら、そうでなければbなら、これと言っています。終わり。しかし、どちらでもない場合はどうでしょうか?終了する方法はありません(つまり、すべての「パス」が値を返すわけではありません)。

私の追加のポイントは、これが可能であれば単一の出口を目指すべき理由の例であるということです。この例では、次のようなことをします。

bool result = false;
if(conditionA)
{
   DoThings();
   result = true;
}
else if(conditionB)
{
   result = false;
}
else if(conditionC)
{
   DoThings();
   result = true;
}

return result;

したがって、ここでは常にreturnステートメントであり、メソッドは常に1か所で終了します。ただし、いくつか考慮すべき点があります...終了値がすべてのパスで有効であるか、少なくとも許容できることを確認する必要があります。たとえば、この決定構造は3つの可能性のみを説明しますが、単一の出口は最終的なelseステートメントとしても機能します。それともそうですか?最終的な戻り値がすべてのパスで有効であることを確認する必要があります。これは、5000万の出口点を持つよりもはるかに優れたアプローチです。

3
Sinaesthetic

これを見てください。 C#の三項演算子です。

bool BooleanValue = (num % 3 != 0) ? true : false;

これは単に原理を示すためのものです。疑問符の左側にある何かの結果に応じて、TrueまたはFalse(または整数や文字列)を返すことができます。素敵なオペレーター、これ。

一緒に3つの選択肢:

      public bool test1()
        {
            int num = 21;
            bool BooleanValue = (num % 3 != 0) ? true : false;
            return BooleanValue;
        }

        public bool test2()
        {
            int num = 20;
            bool test = (num % 3 != 0);
            return test;
        }

さらに短く:

public bool test3()
{
    int num = 20;
    return (bool)(num % 3 != 0);
}
1
netfed
class Program
{
    double[] a = new double[] { 1, 3, 4, 8, 21, 38 };
    double[] b = new double[] { 1, 7, 19, 3, 2, 24 };
    double[] result;


    public double[] CheckSorting()
    {
        for(int i = 1; i < a.Length; i++)
        {
            if (a[i] < a[i - 1])
                result = b;
            else
                result = a;
        }
        return result;
    }

    static void Main(string[] args)
    {
        Program checkSorting = new Program();
        checkSorting.CheckSorting();
        Console.ReadLine();
    }
}

これは動作するはずです、そうでなければ、すべてのコードパスが値を返すわけではないというエラーが出ました。そのため、返される値として結果を設定します。これは、trueに応じてBまたはAのいずれかに設定されます

1