c#动态和使用IEnumerable集合

本文关键字:IEnumerable 集合 动态 | 更新日期: 2023-09-27 18:07:28

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

var list = new List<string>
               {
                   "Hey"
               };
dynamic data = list.Select(x => x);
var count = data.Count();

最后一行抛出错误:'object'不包含'Count'的定义

为什么"data"被视为对象?这个问题发生是因为我调用扩展方法吗?

下面的代码可以工作:

var list = new List<string>
               {
                   "Hey"
               };
dynamic data = list.Select(x => x);
foreach (var s in data)
{
}

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

c#动态和使用IEnumerable集合

似乎扩展方法不能在动态对象上工作(参见Jon的回答)。但是,您可以直接作为静态方法调用它们:

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

是的,那是因为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'