2013-04-05 32 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:/ /stackoverflow.com/questions/5311465/extension-method-and-dynamic-object-in-c-sharp) – nawfal 2014-07-19 20:59:19

回答

5

似乎擴展方法不適用於動態對象(請參閱Jon' answer)。但是,您可以直接調用這些靜態方法:

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

是的,那是因爲Count()是一個擴展方法。

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)作品,因爲data具有器具IEnumerable是一個foreach源 - 有執行中進行(IEnumerable)data轉換。

你可以看到嘗試做以下時mechanish:

dynamic t = 1; 

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

有在運行時拋出一個異常:Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'

[在C#擴展方法和動態對象]的