空结合运算符覆盖

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

xstring.ToLower()??"xx" 

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

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

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

从这篇文章 :

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();

正如其他答案所示。

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

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

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

如果你想避免使用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") 

检查null后应用ToLower()方法:

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

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

标准ECMA-334

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

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

但是,我认为如果你做了什么会更好看

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

你可以使用:

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

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