2008年06月18日

ジェネリックメソッドの型推論

  
最近、ようやく(今頃になって?)、C#2.0が体に沁みこんできたせいか、
ジェネリックスを使うことが多くなってきたのだが、
次のようなコードで嵌った。
 static void Main(string[] args) {
Foo(10);
int[] array = new int[] { 1,2,3 };
Foo(array);
IEnumerable<int> nums = new int[] { 1, 2, 3 };
Foo(nums);
}

static void Foo<T>(T obj) {
Console.WriteLine("T obj");
}

static void Foo<T>(IEnumerable<T> objs) {
Console.WriteLine("IEnumerable<T> objs");
}


この結果だが、

T obj
IEnumerable objs
IEnumerable objs

と表示されるのかと思ったら、

T obj
T obj
IEnumerable objs

だった。
前者だったら良かったのに。


この記事へのコメント
>前者だったら良かったのに。
確かにこれは嫌ですねぇ.

ad-hoc な解決法 (といってもオーバーロードという存在自体 ad-hoc ですが) としては,こんな感じのバージョンも用意することでしょうか.
static void Foo<T>(T[] objs)
{
Console.WriteLine("T[] objs");
}
Posted by NyaRuRu at 2008年06月20日 14:04
NyaRuRuさん、
僕も結局、同じ方法で逃げました。
Posted by Gushwell at 2008年06月20日 17:31
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51545910