是否可以在三元表达式上只放置一个选项?
Posted
技术标签:
【中文标题】是否可以在三元表达式上只放置一个选项?【英文标题】:Is it possible to put only one option on a ternary expression? 【发布时间】:2016-07-04 22:43:29 【问题描述】:我只是好奇这是否可能,或者有没有办法让它成为 C# 的有效语法:
expression == value ? /*do nothing here, or put some empty block like ; */ : SomeClass.SomeMethod();
编辑:对于深入讨论和更多信息,我认为这个块可以工作(如果测试的字典键不存在,它会添加字典。否则,它会跳过):
(!packageDict.ContainsKey(desc)) ? packageDict.Add(desc, subtotal) : /*does nothing*/;
【问题讨论】:
不,这是不可能的。使用if
语句来做到这一点......另一种选择是使用“默认”值或简单地返回两个结果之一。
@Ian 这可能是一个答案,顺便说一句。
你必须返回一些东西,可能是value
本身,默认值等等。
为什么需要它?解释要求(通过提供更多代码).. 可能有一些棘手的方法!
@Moumit 代码添加以获取更多信息和进一步讨论/解释。
【参考方案1】:
通过查看您的代码 sn-p,在这里使用三元运算根本没有意义。
你能做的只有:
if (!packageDict.ContainsKey(desc))
packageDict.Add(desc, subtotal)
【讨论】:
正是我所做的修复它。谢谢!【参考方案2】:不,这是有道理的。 expression
在您的无操作操作中会是什么? null
?和原来一样吗?编译器应该怎么知道?
例如,这将使变量未设置。这里的expression
是什么?
var expression == value ? : SomeClass.SomeMethod();
只要明确你的期望,要么这样:
expression == value ? null : SomeClass.SomeMethod();
expression == value ? default(Expression) : SomeClass.SomeMethod();
或者当value
为真时保持变量相同:
expression == value ? expression : SomeClass.SomeMethod();
if (!value) expression = SomeClass.SomeMethod();
【讨论】:
【参考方案3】:您应该使用IF
语句(它也是最易读的选项)。
另一种方法是对您的类型使用默认值(例如,null
用于引用类型,default(value_type)
用于值类型。例如:
expression == value ? (int?) null : SomeClass.SomeMethod();
【讨论】:
【参考方案4】:这是不可能的,而且意义不大。
三元运算符应该根据条件返回一个值。这个非常重要。你可以这样对待它:
public static SomeType TernaryOperator<T>(Predicate<T> condition)
if (condition())
return something;
else
return somethingElse;
所以如果你删除return something
部分,代码会编译吗?答案无疑是否定的。如果条件为真,该方法将返回什么?
同样的事情也适用于三元运算符。如果条件计算为真,整个表达式将返回什么?未定义!
事实上,一开始就有这个想法是很奇怪的。你为什么想这么做?您可以只使用 if 语句。
if (condition)
// do nothing
else
//something
当然,你总是可以这样做:
if (!condition)
// something
删除无用的花括号。
下次遇到这种情况,用if语句就行了。比较合适。
【讨论】:
【参考方案5】:棘手的方法!!
根据评论部分的讨论
这是使用Dictionary
时非常基本的要求.. 您需要检查这些类型的逻辑测试可能多次.. 所以我建议您写一些extension methods
可以使程序窒息..
public static class Extended
public static void AddKeyIfNotExists<T, V>(this IDictionary<T,V> dictionary, T key, V Value)
if (!dictionary.ContainsKey(key))
dictionary.Add(key, Value);
稍后你可以在你的program seamlessly
中使用它
Dictionary<string,decimal> packageDict= new Dictionary<string,decimal>();
packageDict.AddKeyIfNotExists("demoKey",500);//will add in dictionary
packageDict.AddKeyIfNotExists("demoKey1", 200);//will add in dictionary
packageDict.AddKeyIfNotExists("demoKey", 6);//will not add in dictionary
【讨论】:
以上是关于是否可以在三元表达式上只放置一个选项?的主要内容,如果未能解决你的问题,请参考以下文章