varの型
青柳さんのところより
http://www.divakk.co.jp/blog/aoyagi/archive/2006/02/10/7120.aspx
この場合の var の型は何になるんでしょう?「x is string」 を評価した結果は string にしかなりえないからちゃんと string になるんでしょうか?それとも x は object だから var も object になるんでしょうか?
ちょっと実験してみました。
using System; using System.Query; static class Program { public static void Main () { object[] list = { 1, 2, "abhinaba", 5f, "basu" }; foreach (var v in list.Where(x => x is string)) { Console.WriteLine(v.ToUpper ()); } } } /* x.cs(8,33): error CS0117: 'object' does not contain a definition for 'ToUpper' */
objectの配列に対するWhereはSequence.Where<object>なので、やはりobjectのようですね。これをstringにする場合は、
using System; using System.Query; static class Program { public static void Main () { object[] list = { 1, 2, "abhinaba", 5f, "basu" }; var ss = from x in list where x is string select x as string; foreach (var s in ss) Console.WriteLine(s.ToUpper ()); } }
のようにselectが必要なのかな。selectの実体はSequence.Select<T,S>で、TのIEnumerableをSのそれに変換します。