web-dev-qa-db-ja.com

C#条件演算子エラー代入、呼び出し、増分、減分、待機、および新しいオブジェクト式のみをステートメントとして使用できます

こんにちは私は入力数が素数であるかどうかを見つけるための基本的なプログラムを書いていた。素数をチェックし、numが素数の場合はtrueを返し、それ以外の場合はfalseを返すcheckPrime(num)関数があります。 main()関数で、条件演算子を使用してコードを短くしましたが、不明なエラーが発生します。以下は私のコードです:

static void Main(String[] args) {
    int n = Int32.Parse(Console.ReadLine());
    while (n-- > 0) {
        int num = Int32.Parse(Console.ReadLine());
        (checkPrime(num) == true) ? Console.WriteLine("Prime") : Console.WriteLine("Not Prime");
    }
}

コンパイルすると、Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement条件付きステートメント行でのwhileループ。何が欠けているのかわかりません。同様の質問 here があり、条件付き演算子行は式ではなくステートメントであると人々は答えているので、式の値には何らかのソートまたは割り当てが必要です。同じ種類の例が MSDNリファレンス に示されています。ここで、説明は次のようになります。

// ?: conditional operator.
classify = (input > 0) ? "positive" : "negative";

しかし、理解できないのは、関数の中で、関数の戻り値を確認して出力を出力することだけです。だから私の表現のどこにこの表現が来るのですか?.

7
Naphstor

条件演算子であり、ステートメントではありません。つまり、結果を使用する必要があるため、スタンドアロンにすることはできません。何とかして。コードでは、結果を使用しませんが、代わりに副作用を生成してみてください。

_?_の前の条件に応じて、演算子は最初または2番目の式の結果を返します。ただし、Console.WriteLine()の戻り値の型はvoidです。したがって、演算子には何も返されませんvoidは、_?:_演算子の有効な戻り値の型ではありません。したがって、ここではvoidメソッドを使用できません。

だからあなたはそのようなことをすることができます:

_while (n-- > 0) {
    int num = Int32.Parse(Console.ReadLine());
    string result = checkPrime(num) ? "Prime" : "Not Prime";
    Console.WriteLine(result);
}
_

または、Console.WriteLine()呼び出し内で演算子を使用します。

_while (n-- > 0) {
    int num = Int32.Parse(Console.ReadLine());
    Console.WriteLine(checkPrime(num) ? "Prime" : "Not Prime");
}
_

どちらの例でも、演算子は、条件に応じて2つの文字列のいずれかを返します。これがこの演算子の目的です。


checkPrime()の結果をtrueと比較する必要はありません。結果はすでにboolです。

16
René Vogt