2008/12/27(Sat) 23:58:45 編集(投稿者)
(追記:
同値性:equivalence, 等値性:equality なので,
BCL のスタンスはあくまで"等値性"の再定義ということですね.
C# の言語仕様も「参照型等値演算子」と.
http://msdn.microsoft.com/ja-jp/library/aa664727.aspx
私の誤解で失礼しました.
本投稿は無視して頂けると幸いです.
)
■No30613 (ほにゃ さん) に返信
> 参照型であれば、box命令があっても気にする必要はないのですね。
> 「なんで参照型なのにボックス化されるんだろう?」
> と悩んでいました。
> ありがとうございます。
念のため一点だけ確認したいのですが
タイトルには「参照型の等値演算子」とある一方で,
上に挙げられたコードの少なくとも Test2〜Test4 では
いわゆる参照の同一性を評価しているのが微妙に気になります.
(Test1 は == 演算子のオーバーロード次第)
例えば,以下のように HogeClass の Equals をオーバーライドして,
何と比較されても常に等しいと返すようにしたとします.
interface IHoge { }
class HogeClass : IHoge
{
public override bool Equals(object obj) { return true; }
public override int GetHashCode() { return 0; }
}
にもかかわらず,以下のコードは両方 False を返します.
Console.WriteLine(Test.Test3(new HogeClass(), new HogeClass()));
Console.WriteLine(Test.Test4(new HogeClass(), new HogeClass()));
これは,Test3/Test4 の IL が,常に参照の同一性を比較しようとする
ものだからなのですが,本当にこれは意図した動作ですか?
意図通りであれば,(等値演算子という表現は別として)
こちらの心配のしすぎでしたので読み飛ばしてください.
参考) http://d.hatena.ne.jp/siokoshou/20070527#p3
いわゆる同値性の再定義 (等値性をとるか同一性をとるか) に対応するのであれば,
以下のように IEquatable<T> を使うのがセオリーかなと.
static class Test2
{
public static bool EqTest1<T>(T x, T y) where T : IHoge, IEquatable<T>
{ return x != null ? x.Equals(y) : y == null; }
public static bool EqTest2<T>(T x, T y) where T : IHoge, IEquatable<T>
{ return EqualityComparer<T>.Default.Equals(x, y); }
}