我正在尝试以下方法:
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获取的方式。
答案 0 :(得分:1)
DoubleNAND
- > DoubleNAND
- > DoubleNAND
...)执行此操作的正确方法是使用具有其类型参数的构造函数,如下所示:
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()
方法来完成的。