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のそれに変換します。