我可以定义具有相同参数和返回类型的运算符吗?

时间:2013-08-22 10:00:04

标签: c# operator-keyword

我正在尝试以下方法:

public class DoubleNAND : ...
{
    public static implicit operator DoubleNAND(DoubleNAND d)
    {
        var n = new DoubleNAND();
        if (d.HasState)
            n.State = d.State;
        else if (d.HasValue2)
            n.Value = d.Value;
        return n;
    }
}

它失败并显示以下消息:

  

具有相同参数和返回类型的转换运算符。

为什么呢?

我需要更改DoubleNAND从另一个DoubleNAND获取的方式。

2 个答案:

答案 0 :(得分:1)

  1. 因为它最终会陷入无休止的循环中。 (DoubleNAND - > DoubleNAND - > DoubleNAND ...)
  2. 即使修复了这一点,我们也不希望运营商在不说话的情况下暗中做某事。
  3. 因为规范是这样说的。
  4. 执行此操作的正确方法是使用具有其类型参数的构造函数,如下所示:

    public DoubleNAND(DoubleNAND d) : this()
    {
        if (d.HasState)
            State = d.State;
        else if (d.HasValue2)
            Value = d.Value;
    }
    

答案 1 :(得分:1)

你不能这样做,因为它会改变赋值的含义,这是C#的基础。考虑:

DoubleNAND a = new ...
DoubleNAND b = new ...
a = b; // this means that now both a and b refer to the same object

如果您的代码可以使用,这些将是不同的对象。更糟糕的是:

a = b;
var equal = object.ReferenceEquals(a, b); // equal == False !!!
equal = a.Equals(b); // equal == False!!! - depending on Equal implementation 

这也是无法在C#中覆盖赋值运算符的原因。

我相信你正试图模仿C ++拷贝构造函数,这在C#中是不可能的。

C#中的约定是明确的,通常是通过引入Clone()方法来完成的。

相关问题