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 语句那么有效,在这种情况下,我永远不会使用它。