2016-06-01 1 views
2

Привет Я писал основную программу, чтобы узнать, является ли номер ввода простым или нет. У меня есть функция checkPrime(num), которая проверяет простое число и возвращает true, если num - это простое else возвращает false. Теперь в моей функции main() я использовал условный оператор, чтобы сократить код, но я получаю сообщение об ошибке, о котором я не уверен. Ниже мой код:Ошибка условного оператора C# Только назначение, вызов, приращение, декремент, ожидание и новые объектные выражения могут использоваться как оператор

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 в мое время цикла на условной линии операторов. Я не уверен, что мне не хватает. Существует аналогичный вопрос here, и люди ответили, что строка условного оператора является выражением, а не выражением, поэтому для значения выражения должен быть какой-то вид или присвоение. Тот же вид примера приведен в MSDN reference, где объяснение делает что-то вроде этого

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

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

+3

Возможный дубликат [Метод вызова с использованием тернарного оператора] (http://stackoverflow.com/questions/5490095/method-call-using-ternary-operator) – Peter

ответ

7

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

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^