空值合并运算符覆盖

3

我知道这样做是没有意义的:

xstring.ToLower()??"xx"

因为在检查 null 值之前调用了 ToLower() 方法。 有没有办法解决这个问题,同时保持语法简洁明了? 我是否可以重写字符串的 ?? 运算符,以便仅在 xstring 不为 null 时调用 ToLower() 方法?

可能是Possible to override null-coalescing operator?的重复问题。 - Lukazoid
8个回答

8
你需要的是单子式空检查。目前在C# 5中不可用,但显然将在C# 6.0中提供。
此帖子中:

7. 单子式空检查

在访问属性或方法之前,消除了检查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();,就像其他答案建议的那样。

8

不,你不能重载那个运算符。只需要将 .ToLower 放在空值合并操作符的外面:

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

它们并不完全意味着相同的事情,如果我想成为一个 *,但出于某种原因我希望它是“XX”呢! - user1492051
我没有说它们意思相同 - 但在你的例子中,它们给出了你想要的结果。 - D Stanley
我不是认真的,这只是一个玩笑,请随意笑哈哈。 - user1492051

4

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")

1
目前的C#版本中没有优美的解决方案。 - Michael Gunter
2
与其他编程语言相比,C#真的很美丽。然而,我们一直在不断提高标准... - Federico Berasategui
同意。除了C++之外,这绝对是我首选的编程语言。Java可以从中学习一些东西。 - Michael Gunter
即使是Java程序员也承认这一点。 - Federico Berasategui

3

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

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

2

你可以使用以下方法:

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

语法简单,意图明确。不足之处在于您将对"xx"运行ToLower并添加了一些括号。


2
根据ECMA-334标准,您无法覆盖“??”运算符。 ECMA-334标准

2
我唯一看到的解决方案是执行以下操作:
(xstring ?? "xx").ToLower();

然而,我认为如果您做一些调整,它会看起来更加漂亮。
xstring != null ? xstring.ToLower() : "xx"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接