私は、与えられた整数が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;
}
}
}
return
ステートメントがありません。
コンパイラがコードを見ると、発生する可能性があるが値を返さない3番目のパス(else
)が表示されます。したがってnot all code paths return a value
。
修正案として、ループが終了した後にreturn
を追加します。他の明らかなスポット-else
値を持つreturn
をif-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
}
コンパイラーは、ループの最後の反復で戻る複雑なロジックを取得しないため、ループを終了して、何も返さないことが考えられます。
最後の反復で戻る代わりに、ループの後に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
がスーパーフロースであったかどうかを確認します。
私もこの問題を経験し、簡単な解決策を見つけました
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
}
これは、他の戻り値の型でも機能し、最小限の問題を与えます
選択した初期値はフォールバック値であり、必要な回数だけ値を再割り当てできました。
または単にこのことを行う:
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;
}
}
私は死んだ馬を打ち負かすのが好きですが、私はただ追加のポイントを作りたかっただけです。
まず、問題は、制御構造のすべての条件が対処されていないことです。本質的に、あなたは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万の出口点を持つよりもはるかに優れたアプローチです。
これを見てください。 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);
}
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のいずれかに設定されます