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委托,然后由括号调用.这不是实现这一目标的典型方法.
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"的快捷方式,它们本身不是合法的陈述.
如果您真的想void
在条件运算符中调用方法,可以使用委托:
(something ? new Action(DoThis) : DoThat)();
Run Code Online (Sandbox Code Playgroud)
如果方法采用参数,这将变得更加复杂.
您可以将lambda表达式放在条件或使用中Action<T>
.
但是,这是一件非常愚蠢的事情.
不过,您应该能够做到这一点:
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)
并不是说它真的那么有用。
上述声明不起作用的原因是由其他用户提供的,实际上并没有回答我的真实问题。
经过更多尝试后,我发现您可以使用此运算符来执行上述语句,但它会导致一些错误的代码。
如果我将上面的语句更改为;
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 语句那么有效,在这种情况下,我永远不会使用它。