ジェネリックの型推論は、かなり賢い処理をしているように思います。
次のコードは、2 値の値から、小さい値を返す処理をするジェネリックメソッドです。
public static T Min<T>(T value1, T value2) where T: IComparable<T> {
return value1.CompareTo(value2) < 0 ? value1 : value2;
}
2 つの引数の型と、戻り値の型は全て T という抽象的なデータ型になっています。
なお、T は、IComparable<T> を実装している必要があります。
上記のメソッドを使用して、
あえて異なる型の値
を引数として与えてみます。
更に、どのように型を推論したのかを、戻り値の型名を表示することで確認してみました。
var a = Min(1, 3L);
Console.WriteLine(a); // 1
Console.WriteLine(a.GetType().Name); // Int64
引数では、int 型の 1 と、long 型の 3 を渡した例です。
結果として、long 型(Int64) の 1 という値が返ってきました。
var b = Min(2L, 3m);
Console.WriteLine(b); // 2
Console.WriteLine(b.GetType().Name); // Decimal
引数では、long型の 2 と、decimal 型の 3 を渡した例です。
結果として、decimal 型(Decimal) の 2 という値が返ってきました。
var c = Min(1.2F, 3L);
Console.WriteLine(c); // 1.2
Console.WriteLine(c.GetType().Name); // Single
引数では、float 型の 1.2 と、long 型の 3 を渡した例です。
結果として、float 型(Single) の 1.2 という値が返ってきました。
なんとなく
http://blogs.wankuma.com/rti/archive/2009/08/17/180218.aspx
null 許容型の不思議
に近いネタになってしまった・・・
でも、やっぱりコンパイルエラーにして欲しい気もしますけれども。