で
僕はいまいち理解していないんでしょうけど、何でa.Equals(b)をb.Equals(a)にしただけで問題が消えて無くなったんでしょうねぇ。ランタイムのバグならMartinの言うとおりそれを直すのが正道だし、.NET 2.0で作ったコードがああしないと期待通りの振る舞いをしないというのなら、.NET 2.0の方が交換則をまともに実装できていなくておかしいのだから、やっぱり何かを直すべきものという印象はないですね(そう考えてないMS.NETキティもMLにはいるみたいだけど)。
追記:あ、コレの話です。
追記2:あ、しかも書いてあった…orz 確かにobjectとしての交換則が成立してないっぽい。で、問題はEquals()の引数ではなくて、何を使って比較するかという話なんじゃないかなあ。あ、だからMiguelのあーいう返事になるわけか。
追記3: Kazukiさんが解説してくれました。うん、これがBenと同じ理解ですね。
追記4:
追記多いなあ…。で、私見なんですけど、これは直しても良いんじゃないかなあと思います。「ユーザーの実装に問題があって、コードが期待通りに動作しない」という問題は、僕も経験したことがあります。ていうかMSのSgmlReaderなんですけどね。こいつはMoveTo*Attribute()のどっかにバグがあって、それ単体では表に出なかったんだけど、ReadNode()の実装の違いから、Mono上で動かしたときだけ表に出ちゃった、っていうもので、「こいつはユーザーの教育上直さない方が良いとも思うね」と釘を打ってから、MSコードと同じと思われる動作にしてcommitしました。