2008年8月13日水曜日

Genericに対する勘違い

いきなりですが、↓のようなクラスがあったとします。

class Super
{
public void Write()
{
Console.WriteLine("Super");
}
}
class Sub : Super
{
public new void Write()
{
Console.WriteLine("Sub");
}
}

で、これらクラスに対し


static void Main(string[] args)
{
new Super().Write();
new Sub().Write();
((Super)new Sub()).Write();
Hoge(new Sub());
}

public static void Hoge(Sub t)
{
t.Write();
}
public static void Hoge(Super t)
{
t.Write();
}

というコードを実行した場合、結果は


Super
Sub
Super
Sub


となります。メソッドのオーバーロードが働いた結果ですね。
ここは、期待通り。で、先ほどのコードの9~16行目を



public static void Hoge<T>(T t) where T : Super
{
t.Write();
}


と書き換えた場合、結果は変わらないと思っていました。
しかし、現実は…


Super
Sub
Super
Super


となり



public static void Hoge(Super t)
{
t.Write();
}


と書いた場合と同じでした。残念。
うまくないなぁ。

0 件のコメント: