可以重写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");