是否可以在三元表达式上只放一个选项?

时间:2016-03-18 08:53:53

标签: c# dictionary syntax conditional ternary-operator

我只是好奇这是否可行,或者有没有办法让它成为C#的有效语法:

expression == value ? /*do nothing here, or put some empty block like { ; } */ : SomeClass.SomeMethod();

编辑:对于深入讨论和更多信息,我认为这个块可行(如果测试的字典键不存在,它会添加字典。否则,它会跳过):

(!packageDict.ContainsKey(desc)) ? packageDict.Add(desc, subtotal) : /*does nothing*/;

5 个答案:

答案 0 :(得分:3)

不,这是有道理的。您的无操作行为中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();

答案 1 :(得分:2)

通过查看您的代码段,在此处使用三元操作毫无意义。

您所能做的就是:

if (!packageDict.ContainsKey(desc))
    packageDict.Add(desc, subtotal)

答案 2 :(得分:1)

您应该使用IF语句(它也是最易读的选项)。

另一种方法是为您的类型使用默认值(例如null用于引用类型,或default(value_type)用于值类型。例如:

expression == value ? (int?) null : SomeClass.SomeMethod();

答案 3 :(得分:1)

这是不可能的,也没什么意义。

三元运算符应该根据条件返回一个值。这是非常重要的。您可以将其视为以下内容:

public static SomeType TernaryOperator<T>(Predicate<T> condition) {
    if (condition()) {
        return something;
    } else {
        return somethingElse;
    }
}

因此,如果删除return something部分,代码是否会编译?答案无疑是否定的。如果条件为真, 方法会返回什么?

同样的事情适用于三元运算符。如果条件的计算结果为true,那么整个表达式将返回什么?这是未定义的!

事实上,首先有这个想法是非常奇怪的。你为什么想这么做?你可以使用if语句。

if (condition) {
    // do nothing
} else {
    //something
}

当然,你可以这样做:

if (!condition) {
    // something
}

删除无用的花括号。

下次遇到这种情况时,只需使用if语句即可。它更合适。

答案 4 :(得分:1)

棘手的方式!!

  

根据评论部分的讨论

这是使用select Companyname, SUM(netsales) FROM A GROUP BY A 时非常基本的要求..你需要检查这些类型的逻辑测试可能有时间..所以我建议你写一些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