Neighbourhood super-hero LINQ comes to the rescue より
object[] list = { 1, 2, "abhinaba", 5f, "basu" };foreach( var v in list.Where(x => x is string))
{
Console.WriteLine(v);}
いい感じです。
ところで、この場合の var の型は何になるんでしょう?「x is string」 を評価した結果は string にしかなりえないからちゃんと string になるんでしょうか?それとも x は object だから var も object になるんでしょうか?
ところで、この場合の var の型は何になるんでしょう?「x is string」 を評価した結果は string にしかなりえないからちゃんと string になるんでしょうか?それとも x は object だから var も object になるんでしょうか?
objectになるようですね。ちなみにselectで型を指定するとstringに出来ます。
返信削除ありがとうございます。
返信削除やっぱり object ですか。select まで書けば型を指定できるというのは納得です。
お久しぶりです。
返信削除コメント遅くなってしまいましたが、non-generic IEnumerable の場合
OfType<T> Operatorを使っていただければ、Compilerが型を推論できるようになります。
object[] list = { 1, 2, "abhinaba", 5f, "basu" };
foreach( var v in list.OfType<string>()) {...}
のように書いていただければ、Whereと同じ事が出来ます。
OfType<T>はWeakly Typed SequenceをStrongly Typed Sequenceに変えると同時にコンパイラに型を伝えたい場合に便利です。たとえば、
from e in new EventLog("Application").Entries
where e.Source=="Hoge"
select e;
はコンパイラエラーになってしまいますが、
from e in new EventLog("Application").Entries.OfType<EventLogEntry>()
where e.Source=="Hoge"
select e;
はOKです。