9

今天在遇到Massive的一些问题后,我决定创建一个简单的测试程序来说明问题。我想知道,我在这段代码中犯了什么错误:

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

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

var count = data.Count();

最后一行抛出错误:'object' does not contain a definition for 'Count'

为什么将“数据”视为对象?是否因为我正在调用扩展方法而出现此问题?

以下代码有效:

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

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

foreach (var s in data)
{
}

为什么在这种情况下“数据”被正确地视为 IEnumerable?

4

2 回答 2

6

是的,那是因为Count()它是一种扩展方法。

扩展方法不支持扩展方法形式的动态类型,即像实例方法一样调用。来源

foreach (var s in data)有效,因为data 必须实现IEnumerable成为foreach源 - 在(IEnumerable)data执行期间执行转换。

您可以在尝试执行以下操作时看到该机制:

dynamic t = 1;

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

运行时抛出异常:Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'

于 2013-04-05T10:11:16.950 回答
5

似乎扩展方法不适用于动态对象(请参阅Jon' answer)。但是,您可以将它们直接称为静态方法:

var count = Enumerable.Count(data); // works
于 2013-04-05T10:10:55.213 回答