是否可以重写C#中的类的空合并运算符?可能重写null-coalescing运算符?
说例如我想返回一个默认值,如果一个实例为空,并返回实例,如果它不是。该代码看起来像这样的事情:
return instance ?? new MyClass("Default");
但如果我想使用空合并运算符还检查MyClass.MyValue设置?
当然没有真正的需要(至少我这么认为) - 所以在你回答“你为什么要这样做”之前 - 我只是好奇,如果有可能。
是否可以重写C#中的类的空合并运算符?可能重写null-coalescing运算符?
说例如我想返回一个默认值,如果一个实例为空,并返回实例,如果它不是。该代码看起来像这样的事情:
return instance ?? new MyClass("Default");
但如果我想使用空合并运算符还检查MyClass.MyValue设置?
当然没有真正的需要(至少我这么认为) - 所以在你回答“你为什么要这样做”之前 - 我只是好奇,如果有可能。
好问题!在list of overloadable and non-overloadable operators中没有列出这种或那种方式,在the operator's page上没有提及。
所以我试过如下:
public class TestClass
{
public static TestClass operator ??(TestClass test1, TestClass test2)
{
return test1;
}
}
,我得到的错误“重载的二元运算符预期”。所以我想说的答案是,从.NET 3.5开始,一个不。
答案很简单:没有
C#设计原则不允许操作符重载的语言的这种变化语义。因此,诸如复合赋值,三元运算符和......之类的复杂运算符不能被重载。
如果有人在这里寻找一个解决方案,最近的例子是这样做
return instance.MyValue != null ? instance : new MyClass("Default");
-1:你错过了这一点,你已经可以用OP的代码来做你的建议......也请仔细阅读这个问题,他不是在问怎么做,但如果有可能过载空合并运算符 - 不幸的是,这不是。 – ANeves 2010-09-13 18:08:23
据传这是C#下一个版本的一部分。从http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
7.单子空检查
不再需要访问属性或方法之前检查空值。在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;
帕特里克,用途:我想超载弦的空合并运算考虑空为空。无论这是明智的还是其他的,这是一个不同的问题。 – ANeves 2010-09-13 18:10:46