2008-12-08 19 views
36

是否可以重写C#中的类的空合并运算符?可能重写null-coalescing运算符?

说例如我想返回一个默认值,如果一个实例为空,并返回实例,如果它不是。该代码看起来像这样的事情:

return instance ?? new MyClass("Default"); 

但如果我想使用空合并运算符还检查MyClass.MyValue设置?

当然没有真正的需要(至少我这么认为) - 所以在你回答“你为什么要这样做”之前 - 我只是好奇,如果有可能

+0

帕特里克,用途:我想超载弦的空合并运算考虑空为空。无论这是明智的还是其他的,这是一个不同的问题。 – ANeves 2010-09-13 18:10:46

回答

29

好问题!在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开始,一个不。

6

答案很简单:没有

C#设计原则不允许操作符重载的语言的这种变化语义。因此,诸如复合赋值,三元运算符和......之类的复杂运算符不能被重载。

14

根据ECMA-334标准,不可能重载?运营商。

同样,你不能重载以下运算符:

  • =
  • & &
  • ||
  • 检查
  • 选中
  • 的typeof
-2

如果有人在这里寻找一个解决方案,最近的例子是这样做

return instance.MyValue != null ? instance : new MyClass("Default"); 
+2

-1:你错过了这一点,你已经可以用OP的代码来做你的建议......也请仔细阅读这个问题,他不是在问怎么做,但如果有可能过载空合并运算符 - 不幸的是,这不是。 – ANeves 2010-09-13 18:08:23

2

据传这是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;