演算子のオーバーロード (C# によるプログラミング入門)

http://ufcpp.net/study/csharp/oo_operator.html

代入演算

代入演算子は直接オーバーロードすることは出来ませんが、 対応する2項演算子オーバーロードすることで利用可能になります。

例えば、+ 演算子オーバーロードした型は、 x += y とすることで、 x = x + y と同じ結果が得られます。

C# とは、こんな仕様だったのか。これだと、

Foo x = new Foo();
Foo y = new Foo();
x += y;

とすると、最初の x と、代入演算をした後の x は、異なるインスタンスということになる。


実際に、

Foo x = new Foo();
Foo y = new Foo();
Foo z = x;
x += y;
Console.WriteLine(System.Object.ReferenceEquals(x, z));

は False と表示される。


「代入演算」という演算をしたのにインスタンスが変わるって、なんか面食らうな。


これで困る場面としては、たとえば、getter しかないプロパティーに代入演算したい場合だ。たとえば、

Foo x = new Foo();
Hoge h = new Hoge();
h.FooProp += x;

としたいときは、Hoge クラスの FooProp というプロパティーに setter がないとできない。