【问题标题】:Conditional operators not behaving as expected [duplicate]条件运算符的行为不符合预期[重复]
【发布时间】:2020-10-29 07:00:17
【问题描述】:

我正在学习条件运算符。 documentation 提到

condition ? consequent : alternative

在我的示例中,Test1() 是当前有效的方法,但我想使用 Test2() 中所示的条件运算符编写等效方法。

  public void Test1(bool isTrue)
  {
     if (isTrue)
     {
        MethodA();
     }
     else
     {
        MethodB();
     }
  }

  public void Test2(bool isTrue)
  {
     isTrue ? MethodA() : MethodB();
  }


  public void MethodA()
  {
     //Do This
  }

  public void MethodB()
  {
     //Do That
  }

我收到 Test2() 的错误

"isTrue" 是一个变量,但用作类型

Local Function 'MethodA()' 必须声明一个主体,因为它没有标记为 'static extern'

有人能解释一下为什么会这样吗?

【问题讨论】:

    标签: c# conditional-operator


    【解决方案1】:

    这行不通,因为您不能将三元 expressionsvoid 返回值一起使用。请改用if 语句,如Test1

    此外,即使MethodAMethodB 的返回类型不是void,您也必须始终使用三元的返回值,因为它不像函数调用那样是statement ,它可以独立存在。

    因此,您的 Test2 方法应如下所示(假设返回类型为 TMethodAMethodB):

    public void Test2(bool isTrue)
    {
        var tmp = isTrue ? MethodA() : MethodB();
    }
    

    public T Test2(bool isTrue)
     => isTrue ? MethodA() : MethodB();
    

    MethodA 中的编译器错误应该是Test2 的无效正文直接导致的。

    【讨论】:

      【解决方案2】:

      此条件运算符用于为变量赋值。 例如

      Public bool DoSomeThing() {return true;}
      Public void main() {
          String message= doSomeThing()?  "Succeed" :"Failed" ;
          ... 
          } 
          
      

      对于这个例子,在第 1 行中,我们从 doSomeThing 方法给出的结果是它是 bool 类型。 如果结果为真,则消息变量获得“成功”值,如果结果为假,则消息变量获得“失败”。 这只是使用该运算符的一个简单示例,该运算符确实用于为变量赋值,而在您的代码中,您希望执行该运算符不适合您的场景的方法。

      【讨论】:

        猜你喜欢
        • 2016-08-06
        • 2023-03-03
        • 2016-09-10
        • 2017-12-28
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2023-01-23
        • 2015-05-15
        相关资源
        最近更新 更多