是否可以在三元表达式上只放置一个选项?
Is it possible to put only one option on a ternary expression?
我只是好奇这是否可行,或者是否有办法让它成为 C# 的有效语法:
expression == value ? /*do nothing here, or put some empty block like { ; } */ : SomeClass.SomeMethod();
编辑:为了深入讨论和更多信息,我认为这个块可以工作(如果测试的字典键不存在,它会添加字典。否则,它会跳过):
(!packageDict.ContainsKey(desc)) ? packageDict.Add(desc, subtotal) : /*does nothing*/;
不,这是有道理的。 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();
您应该使用 IF
语句(这也是最易读的选项)。
另一种方法是为您的类型使用默认值(例如,null
用于引用类型或 default(value_type)
用于值类型。例如:
expression == value ? (int?) null : SomeClass.SomeMethod();
这是不可能的,也没有什么意义。
三元运算符应该return 一个基于条件 的值。这个非常重要。你可以这样对待它:
public static SomeType TernaryOperator<T>(Predicate<T> condition) {
if (condition()) {
return something;
} else {
return somethingElse;
}
}
所以如果你删除 return something
部分,代码会编译吗?答案无疑是否定的。如果条件为真, 方法 return 会是什么?
同样的事情也适用于三元运算符。如果条件的计算结果为真,那么整个表达式 return 会是什么?这是未定义的!
其实,一开始就有这个想法是很奇怪的。你为什么想这么做?您可以只使用 if 语句。
if (condition) {
// do nothing
} else {
//something
}
当然,你也可以这样做:
if (!condition) {
// something
}
删除无用的花括号。
下次遇到这种情况,就用if语句吧。比较合适
通过查看您的代码片段,在这里使用三元运算根本没有意义。
你所能做的就是:
if (!packageDict.ContainsKey(desc))
packageDict.Add(desc, subtotal)
取巧的方法!!
as per discussion in comment section
这是使用 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
我只是好奇这是否可行,或者是否有办法让它成为 C# 的有效语法:
expression == value ? /*do nothing here, or put some empty block like { ; } */ : SomeClass.SomeMethod();
编辑:为了深入讨论和更多信息,我认为这个块可以工作(如果测试的字典键不存在,它会添加字典。否则,它会跳过):
(!packageDict.ContainsKey(desc)) ? packageDict.Add(desc, subtotal) : /*does nothing*/;
不,这是有道理的。 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();
您应该使用 IF
语句(这也是最易读的选项)。
另一种方法是为您的类型使用默认值(例如,null
用于引用类型或 default(value_type)
用于值类型。例如:
expression == value ? (int?) null : SomeClass.SomeMethod();
这是不可能的,也没有什么意义。
三元运算符应该return 一个基于条件 的值。这个非常重要。你可以这样对待它:
public static SomeType TernaryOperator<T>(Predicate<T> condition) {
if (condition()) {
return something;
} else {
return somethingElse;
}
}
所以如果你删除 return something
部分,代码会编译吗?答案无疑是否定的。如果条件为真, 方法 return 会是什么?
同样的事情也适用于三元运算符。如果条件的计算结果为真,那么整个表达式 return 会是什么?这是未定义的!
其实,一开始就有这个想法是很奇怪的。你为什么想这么做?您可以只使用 if 语句。
if (condition) {
// do nothing
} else {
//something
}
当然,你也可以这样做:
if (!condition) {
// something
}
删除无用的花括号。
下次遇到这种情况,就用if语句吧。比较合适
通过查看您的代码片段,在这里使用三元运算根本没有意义。
你所能做的就是:
if (!packageDict.ContainsKey(desc))
packageDict.Add(desc, subtotal)
取巧的方法!!
as per discussion in comment section
这是使用 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