2013-04-05 7 views
9

Massiveでいくつかの問題が発生した後、問題を説明するための簡単なテストプログラムを作成することにしました。私はこのコードでやっているのミス何、疑問に思う:C#動的でIEnumerableコレクションで作業する

var list = new List<string> 
       { 
        "Hey" 
       }; 

dynamic data = list.Select(x => x); 

var count = data.Count(); 

最後の行でエラーが発生します:なぜ「オブジェクト」「はカウント」

の定義が含まれていません。オブジェクトとして扱われる "データ"?私は拡張メソッドを呼び出しているので、この問題は発生しますか?

次のコードは動作します:

var list = new List<string> 
       { 
        "Hey" 
       }; 

dynamic data = list.Select(x => x); 

foreach (var s in data) 
{ 
} 

この場合には、 "データ" が正しくIEnumerableをとして扱われるのはなぜ?

+0

可能重複します(http:/

dynamic t = 1; foreach (var i in t) Console.WriteLine(i.ToString()); 

は、実行時にスローされた例外があります:

次のやろうとしているmechanishを見ることができます/stackoverflow.com/questions/5311465/extension-method-and-dynamic-object-in-c-sharp) – nawfal

答えて

5

動的オブジェクトでは拡張メソッドが機能しないようです(Jon' answer参照)。ただし、静的メソッドとして直接それらを呼び出すことができます。Count()は、拡張メソッドであるため、

var count = Enumerable.Count(data); // works 
6

をはい、それはです。

extension methods aren't supported by dynamic typing in the form of extension methods, i.e. called as if they were instance methods. (source)

foreach (var s in data)作品、dataforeach源であることが器具IEnumerable必要があるため - 実行中に実行(IEnumerable)data変換があります。 Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'

[C#で拡張メソッドと動的オブジェクト]の
関連する問題