0

我正在尝试以下操作:

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 的方式。

4

2 回答 2

1
  1. 因为它最终会陷入无限循环。( DoubleNAND-> DoubleNAND-> DoubleNAND...)
  2. 即使这是固定的,我们也不希望运营商不言而喻地隐含地做某事。
  3. 因为规范是这样说的。

正确的方法是使用带有其类型参数的构造函数,如下所示:

public DoubleNAND(DoubleNAND d) : this()
{
    if (d.HasState)
        State = d.State;
    else if (d.HasValue2)
        Value = d.Value;
}
于 2013-08-22T10:10:11.280 回答
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()方法来完成。

于 2013-08-22T10:10:27.040 回答