こんな感じ。
class Hoge
{
}
class Fuga : Hoge
{
}
class Piyo : Hoge
{
}
class Program
{
static void Main(string[] args)
{
var hoge1 = new Hoge();
var hoge2 = new Hoge();
var fuga1 = new Fuga();
var fuga2 = new Fuga();
var piyo = new Piyo();
bool b1 = hoge1.Equals(hoge2); // T = Hoge
bool b2 = hoge1.Equals(fuga1); // T = Hoge
bool b3 = fuga1.Equals(fuga2); // T = Fuga
bool b4 = fuga1.Equals(hoge1); // T = Hoge (!!)
//bool b5 = fuga1.Equals(piyo); // Build Error !!
bool b6 = fuga1.Equals((Hoge)piyo); // T = Hoge
bool b7 = fuga1.Equals<Hoge>(piyo); // T = Hoge
}
}
[検証プログラム]
インテリセンスに Object.Equals(object) が出てこないこと、Equals の引数の型が自分自身になることを確認できます。
ビルドが出来るだけで実行は出来ません。
ダウンロードページ
public class Object
{
protected internal virtual bool Equals(object obj)
{
...
}
}
public static class ObjectExtension
{
public static bool Equals<T>(this T source, T obj)
{
if (source == null)
{
// return (obj == null); にするのも面白い
throw new NullReferenceException();
}
return source.Equals((object)obj);
}
}
あまり深く考えずに言っているので、なんらかの不都合が生じるかもしれないけど。。。
つか、拡張メソッドのサポートを全ての言語に強いることになるからダメかな。
つかつか、やっぱし自分自身の型を示すキーワードが欲しくなる。