在今天遇到Massive的一些问题后,我决定创建一个简单的测试程序来说明问题.我想知道,我在这段代码中犯的错误是什么:
var list = new List<string>
{
"Hey"
};
dynamic data = list.Select(x => x);
var count = data.Count();
Run Code Online (Sandbox Code Playgroud)
最后一行抛出错误:'object'不包含'Count'的定义
为什么"数据"被视为对象?出现此问题是因为我正在调用扩展方法吗?
以下代码有效:
var list = new List<string>
{
"Hey"
};
dynamic data = list.Select(x => x);
foreach (var s in data)
{
}
Run Code Online (Sandbox Code Playgroud)
为什么在这种情况下"数据"被正确地视为IEnumerable?
是的,那是因为Count()是一种扩展方法.
扩展方法形式的动态类型不支持扩展方法,即调用它们就像实例方法一样.(来源)
foreach (var s in data)工作,因为data 必须实现IEnumerable作为foreach源 - 在(IEnumerable)data执行期间执行转换.
在尝试执行以下操作时,您可以看到该机制:
dynamic t = 1;
foreach (var i in t)
Console.WriteLine(i.ToString());
Run Code Online (Sandbox Code Playgroud)
运行时抛出异常: Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'
似乎扩展方法不适用于动态对象(请参阅Jon的回答).但是,您可以直接将它们称为静态方法:
var count = Enumerable.Count(data); // works
Run Code Online (Sandbox Code Playgroud)