【发布时间】:2017-03-27 08:13:15
【问题描述】:
我有以下问题:
我可以静态重载 operator+ 来添加一些自定义对象:
public static obj operator+(obj A, obj B)
{
obj ret = new obj();
ret.magic = A.magic + B.magic;
return ret;
}
返回的是一个新对象,它得到了 whatever 由 operator+ 求和。这是完美的。
但是写的时候……
obj A, B;
/* ... */
A += B;
这不会增加A,它会构造一个新的A。所以A不只是持有一个新的值,它是一个全新的对象,这不是我写A += B时想要的。
那么像我在 C++ 中那样重载一元赋值运算符的 C# 方法是什么?
因为,在上面的静态运算符+ - 函数中,只需省略第一行,A 在以下情况下就会发生变化:
obj C = A + B;
所以,原因很明显:
在A += B 之后,A 应该仍然是相同的对象。
当然,我可以按照应有的方式实现它:
public obj add(obj B)
{
magic += B.magic;
return this;
}
public static obj operator+(obj A, obj B)
{
obj ret = new obj();
ret.magic = A.magic;
ret.add(B);
return ret;
}
但是,它仍然不会在A += B 上被调用,这将超出预期。
【问题讨论】:
-
你的运算符重载代码创建了一个新对象并将a和b的值相加为魔术属性。您应该执行
a.magin += b.magin; return a;来查看对象 a 中发生的变化。