代码之家  ›  专栏  ›  技术社区  ›  Patrik Svensson Martin Ender

是否可以重写空合并运算符?

  •  39
  • Patrik Svensson Martin Ender  · 技术社区  · 16 年前

    是否可以为C中的类重写空合并运算符?

    比如说,如果一个实例为空,我想返回一个默认值;如果不为空,则返回该实例。代码如下所示:

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

    但是,如果我想使用空合并运算符来检查myClass.myValue是否已设置呢?

    当然没有必要这样做(至少我认为是这样),所以在你回答“你为什么要这样做”之前, 我只是好奇是否有可能 .

    5 回复  |  直到 11 年前
        1
  •  29
  •   Simon    16 年前

    好问题!它没有以某种方式列在 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开始,答案是否定的。

        2
  •  14
  •   Mark Rucker    12 年前

    根据 ECMA-334 标准,是不可能超载的?运算符。

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

    • =
    • &&
    • γ
    • ?:
    • 选中的
    • 未检查的
    • 新的
    • 类型
    • 作为
        3
  •  6
  •   Mehrdad Afshari    16 年前

    简单回答:不

    C设计原则不允许使用改变语言语义的运算符重载。因此,复合算符如复合赋值、三元算符和…不能超载。

        4
  •  3
  •   Robert Levy    11 年前

    据说这是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;
    
        5
  •  -2
  •   soniiic    14 年前

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

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