方法使用三元运算符调用

Kyl*_*ven 41 c# conditional-operator

在玩弄新概念时,我偶然发现了Ternary Operator它的美丽.在玩了一段时间之后,我决定测试它的极限.

然而,当我无法编译某段代码时,我的乐趣很快就结束了.

int a = 5;
int b = 10;
a == b ? doThis() : doThat() 

    private void doThis()
    {
        MessageBox.Show("Did this");
    }
    private void doThat()
    {
        MessageBox.Show("Did that");
    }
Run Code Online (Sandbox Code Playgroud)

这行给了我两个错误:

Error   1   Only assignment, call, increment, decrement, and new object expressions can be used as a statement
Error   2   Type of conditional expression cannot be determined because there is no implicit conversion between 'void' and 'void'
Run Code Online (Sandbox Code Playgroud)

我从来没有使用Ternary Operator过来决定调用哪种方法,也不知道它是否可行.我只是喜欢一行If Else Statement方法调用的想法.

我做了一些研究,我找不到任何人这样做的例子,所以我想我可能希望有一些无法提供的东西.

如果这是可能的,请在我的错误行为中启发我,这是不可能的,还有另一种方式吗?

Ner*_*ury 38

三元运算符用于返回值,必须分配这些值.假设方法doThis()doThat()返回值,一个简单的赋值将解决您的问题.

如果你想做你正在尝试的事情,这是可能的,但解决方案并不漂亮.

int a = 5;
int b = 10;
(a == b ? (Action)doThis : doThat)();
Run Code Online (Sandbox Code Playgroud)

这将返回一个Action委托,然后由括号调用.这不是实现这一目标的典型方法.

  • 确实,这不是正确的做事方式;但绝对是这个问题最正确的答案:OP想要使用三元运算符来选择要调用的方法,而这正是您的代码片段所做的;) (2认同)
  • 这对新的表达式主体运算符 (=>) 来说很棒 (2认同)

ilu*_*uxa 18

三元运算符必须返回一些东西.典型用法是这样的:

int x = (a > b) ? a : b;
Run Code Online (Sandbox Code Playgroud)

如果你尝试类似的东西

a + b;
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨.

(a > b) ? a - b : b - a;
Run Code Online (Sandbox Code Playgroud)

基本上是"a - b"或"b - a"的快捷方式,它们本身不是合法的陈述.

  • +1.如果DoThis()和DoThat()返回了某些内容,则可以使用三元来控制执行并将结果分配给某个局部变量,但这不是三元运算符的意图; 其他开发人员会认为返回值比副作用更重要.使用基本的if语句; 你的意图将保持清晰(你不必为了聪明而弄乱你的方法签名). (5认同)
  • +1,另一个关键点是,可以从三元运算符返回的两个值必须是相同的类型,或者可以隐式转换为相同的类型. (4认同)

SLa*_*aks 9

如果您真的想void在条件运算符中调用方法,可以使用委托:

(something ? new Action(DoThis) : DoThat)();
Run Code Online (Sandbox Code Playgroud)

如果方法采用参数,这将变得更加复杂.
您可以将lambda表达式放在条件或使用中Action<T>.

但是,这是一件非常愚蠢的事情.


ska*_*ats 6

不过,您应该能够做到这一点:

        int a = 5;
        int b = 10;

        var func = a == b ? (Action)doThis : (Action)doThat; // decide which method

        func(); // call it
Run Code Online (Sandbox Code Playgroud)

并不是说它真的那么有用。


Kyl*_*ven 3

上述声明不起作用的原因是由其他用户提供的,实际上并没有回答我的真实问题。

经过更多尝试后,我发现您可以使用此运算符来执行上述语句,但它会导致一些错误的代码。

如果我将上面的语句更改为;

int a = 5;
int b = 10;
int result = a == b ? doThis() : doThat(); 

private int doThis()
{
    MessageBox.Show("Did this");
    return 0;
}
private int doThat()
{
    MessageBox.Show("Did that");
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

该代码将按其应有的方式编译和执行。但是,如果这些方法最初并不打算返回任何内容,并且引用了代码中的其他区域,那么您现在每次调用这些方法时都必须处理一个返回对象。

否则,您现在可以将三元运算符用于单行方法选择器,甚至可以使用结果知道它在下一行中调用哪个方法。

int result = a == b ? doThis() : doThat();

if (result == 0)
   MessageBox.Show("You called doThis()!");
Run Code Online (Sandbox Code Playgroud)

现在,这段代码绝对没有意义,可以通过 If Else 轻松完成,但我只是想知道它是否可以完成,以及你必须做什么才能让它工作。

现在我知道您可以在这些方法中有效地返回任何类型,这可能会变得更有用。它可能被认为是“糟糕的编码实践”,但在它从未想过的情况下可能会变得非常有用。

您可以根据任何条件访问一个或另一个对象,这在一行代码中可能非常有用。

UserPrivileges result = user.Group == Group.Admin ? GiveAdminPrivileges() : GiveUserPrivileges();

private UserPrivileges GiveAdminPrivileges()
{
      //Enter code here
      return var;
}
private UserPrivileges GiveUserPrivileges()
{
      //Enter code here
      return var;
}
Run Code Online (Sandbox Code Playgroud)

当然,这可以通过 If 语句来完成,但我认为将三元运算符用于其他用途会使编程变得有趣。现在,这可能不如 If Else 语句那么有效,在这种情况下,我永远不会使用它。