可以重写null-coalescing运算符?

是否有可能重写C#中的类的空合并运算符?

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

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

但是,如果我想使用空合并运算符来检查MyClass.MyValue是否被设置?

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

好问题! 在可重载和不可重载操作符的列表中没有列出这种或那种方式,操作员的页面上没有提到任何东西。

所以我尝试了以下几点:

 public class TestClass { public static TestClass operator ??(TestClass test1, TestClass test2) { return test1; } } 

我得到错误“预计可重载二元运算符”。 所以我会说,答案是,从.NET 3.5,一个没有。

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

同样,您不能重载以下操作符:

  • =
  • &&
  • ||
  • 检查
  • 未选中
  • types

简单的答案:不

C#devise原则不允许运算符重载,这会改变语言的语义。 因此复合赋值,三元运算符和…这样的复杂运算符不能被重载。

据传这是C#的下一个版本的一部分。 从http://damieng.com/blog/2013/12/09/probable-c-6-0-features-说明;

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; 

如果有人在这里寻找解决scheme,最接近的例子就是做这个

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