2008年8月13日水曜日

Genericに対する勘違い

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

  1. class Super  
  2. {  
  3.  public void Write()  
  4.  {  
  5.   Console.WriteLine("Super");  
  6.  }  
  7. }  
  8. class Sub : Super  
  9. {  
  10.  public new void Write()  
  11.  {  
  12.   Console.WriteLine("Sub");  
  13.  }  
  14. }  

で、これらクラスに対し


  1. static void Main(string[] args)  
  2. {  
  3.  new Super().Write();  
  4.  new Sub().Write();  
  5.  ((Super)new Sub()).Write();  
  6.  Hoge(new Sub());  
  7. }  
  8.   
  9. public static void Hoge(Sub t)  
  10. {  
  11.  t.Write();  
  12. }  
  13. public static void Hoge(Super t)  
  14. {  
  15.  t.Write();  
  16. }  

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


Super
Sub
Super
Sub


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



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


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


Super
Sub
Super
Super


となり



  1. public static void Hoge(Super t)  
  2. {  
  3.  t.Write();  
  4. }  


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

0 件のコメント: