代码之家  ›  专栏  ›  技术社区  ›  Viper

如果还有捷径惊喜

  •  0
  • Viper  · 技术社区  · 14 年前

    我很惊讶第三个解决方案不起作用(编译器说: ; is missing

    bool isFoobar = true;
    
    isFoobar == true ? isFoobar = false : isFoobar = true; // [1] works
    ( isFoobar ? isFoobar = false : isFoobar = true ); // [2] works
    isFoobar ? isFoobar = false : isFoobar = true; // [3] failed
    

    嗯,为什么最后一个不起作用?

    7 回复  |  直到 14 年前
        1
  •  2
  •   Guffa    14 年前

    当我尝试这些代码时,它们都不起作用。你不能用这样的表达式作为语句。

    如果将表达式用作表达式,则这三个表达式都有效:

    bool isFoobar = true;
    bool x;
    
    x = isFoobar == true ? isFoobar = false : isFoobar = true;
    x = ( isFoobar ? isFoobar = false : isFoobar = true );
    x = isFoobar ? isFoobar = false : isFoobar = true;
    

    如果您只想使用它作为If的快捷方式,而不想使用结果,那么您使用它的方式是错误的。条件运算符应用于表达式,而不是if语句。

        2
  •  7
  •   Matt Ellen Bipin Vayalu    14 年前

    这些都不对。它们都有编译器错误。

    正确的语法是:

    isFoobar = isFoobar ? false : true;
    

    更新

    1和2:

    只有赋值、调用、增量、减量和新对象表达式才能用作语句

    三:

    ;预期的

        3
  •  7
  •   Evan Mulawski    14 年前

    更好的解决方案是:

    isFoobar = !isFoobar;
    
        4
  •  1
  •   Fredou    14 年前

    在.net 3.5下,这个工作和编译

            bool isFoobar = true;
    
            var a = isFoobar == true ? isFoobar = false : isFoobar = true; // [1] works
            var b = ( isFoobar ? isFoobar = false : isFoobar = true ); // [2] works
            var c = isFoobar ? isFoobar = false : isFoobar = true; // [3] works
    

    a、 b和c是布尔型

        5
  •  1
  •   Femaref    14 年前

    你用错了。三元运算符用于根据谓词分配变量,而不是在这两种情况下执行代码。

      var obj = predicate ? true_case : false_case; //if predicate is true, true_case will be assigned to obj.
    
        6
  •  0
  •   slugster Joey Cai    14 年前

    你弄错了,他们都没有编译。试着评论第三行,看看会发生什么。三元语句的true/false部分需要返回一个值,但您没有这样做。

        7
  •  0
  •   Sheen    14 年前

    isFoobar ? isFoobar = false : isFoobar = true;
    

    它给出的错误和问题中的一样,

    如果语句如下:

    isFoobar ? (isFoobar = false) : (isFoobar = true);