空结合运算符覆盖

时间:2014-01-10 18:20:11

标签: c#

我知道做以下事情是没有意义的:

xstring.ToLower()??"xx"

因为我在调用null之前调用了ToLower()。 有没有办法解决这个问题,保持语法清晰干净?

我可以覆盖字符串的??运算符,以便在ToLower()不是xstring时只调用null吗?

8 个答案:

答案 0 :(得分:8)

不,你不能超载该运营商。只需将.ToLower放在合并之外:

(xstring ?? "xx").ToLower();

答案 1 :(得分:8)

您要找的是Monadic Null Checking。它目前在C#5中不可用,但显然它将在C#6.0中提供。

来自this post

7。 Monadic null检查

在访问属性或方法之前,不需要检查空值。在Groovy中称为安全导航操作员

<强>之前

if (points != null) {
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
}   
return -1;

<强>后

var bestValue = points?.FirstOrDefault()?.X ?? -1;

同时,只需使用

(xstring ?? "xx").ToLower();

正如其他答案所示。

答案 2 :(得分:4)

否,但有传言称为此目的将?.运算符添加到下一版本的C#中。请参阅http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

上的#7

答案 3 :(得分:3)

如果你想避免使用ToLower() - 字面值“xx”,你就会遇到?:三元运算符。

xstring != null ? xstring.ToLower() : "xx"

或者你可以写一个扩展方法,但这看起来很奇怪。

public static string ToLowerOrDefault(this string input, this string defaultValue)
{
    return (input != null ? input.ToLower() : defaultValue);
}

你可以这样使用:

xstring.ToLowerOrDefault("xx")

答案 4 :(得分:3)

检查ToLower()

应用null方法:

(xstring ?? "xx").ToLower();

答案 5 :(得分:2)

根据ECMA-334你不能覆盖?操作

Standard ECMA-334

答案 6 :(得分:2)

我将看到的唯一解决方案是:

(xstring ?? "xx").ToLower();

但是,我认为如果你做了一些事情会更好看

xstring != null ? xstring.ToLower() : "xx"

答案 7 :(得分:2)

您可以使用:

(xstring ?? "xx").ToLower()

语法简单,意图明确。在缺点方面,您将在ToLower上运行"xx",并添加了一些括号。