2013-04-05 61 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#扩展方法和动态对象]的