【问题标题】:C# conditional operator error Only assignment, call, increment, decrement, await, and new object expressions can be used as a statementC#条件运算符错误只有赋值、调用、递增、递减、等待和new对象表达式可以作为语句使用
【发布时间】:2016-10-01 01:32:51
【问题描述】:

您好,我正在编写一个基本程序来查找输入数字是否为素数。我有一个checkPrime(num) 函数,它检查素数并返回true,如果num 是素数,则返回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");
    }
}

编译时,我在条件语句行的 while 循环中收到 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";

但我无法理解的是在我的函数中,我想做的只是检查函数的返回值,然后打印输出。那么在我的情况下,这个表达的东西来自哪里。

【问题讨论】:

标签: c# compiler-errors expression conditional-operator


【解决方案1】:

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

【讨论】:

  • 感谢您的解释。我现在明白了。我一直认为它是 if-else 的一行替换,但您的解释是有道理的。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2014-01-04
  • 2015-07-05
  • 2020-11-24
  • 1970-01-01
相关资源
最近更新 更多