Вопрос по compiler-errors, conditional-operator, c#, expression – Ошибка условного оператора C # В качестве оператора могут использоваться только выражения присваивания, вызова, приращения, уменьшения, ожидания и новых объектов

6

Привет, я писал основную программу, чтобы найти, является ли введенное число простым или нет. у меня естьcheckPrime(num) функция, которая проверяет простое число и возвращаетtrue если число простое, иначе возвращаетсяfalse, Теперь в моем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 в строке условного оператора. Я не уверен, что мне не хватает. Есть похожий вопросВот и люди ответили, что строка условного оператора - это выражение, а не оператор, поэтому для значения выражения должен быть какой-то вид или присваивание. Такой же пример приведен вСсылка на MSDN где объяснение делает что-то вроде этого

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

Но я не могу понять, что в моей функции все, что я пытаюсь сделать, это проверить возвращаемое значение функции, а затем распечатать вывод. Так откуда же это выражение в моем случае?

Ваш Ответ

1   ответ
15

условный оператор являетсявыражение, а не утверждение, это означает, что он не может оставаться в одиночестве, так как результат должен быть каким-то образом использован. В своем коде вы не используете результат, но пытаетесь произвестипобочные эффекты вместо.

В зависимости от состояния до? Операторвозвращает результат или первого или второго выражения. Но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");
}

В обоих примерах операторвозвращает одну из двух строк в зависимости от условия, Вот для чего этот оператор.

Заметка что вам не нужно сравнивать результатcheckPrime() вtrue, Результат ужеbool.

Спасибо за объяснение. Я получаю это сейчас. Я всегда думал, что это замена одной строки if-else, но ваше объяснение имеет смысл. еще раз спасибо. Naphstor

Похожие вопросы