猿问

可拓方法与动态对象

可拓方法与动态对象

我将把我的问题总结成下面的代码片段。

List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };Console.WriteLine(list.First());

以上代码运行良好。

现在我尝试了以下几种方法

dynamic dList = list;
 Console.WriteLine(dList.First());

但是我得到RuntimeBinderException,为什么会这样?


隔江千里
浏览 340回答 3
3回答

慕后森

动态类型不支持扩展方法以可拓方法的形式,即调用它们就好像它们是实例方法一样。然而,这将起作用:dynamic dList = list;Console.WriteLine(Enumerable.First(dList));当然,这可能有用,也可能没有用。如果您能够提供更多关于为什么和如何使用动态类型的信息,我们可能会提供更多帮助。

弑天下

个方法不起作用的原因是,在常规的、非动态的代码扩展方法中,通过对编译器已知的所有类进行完全搜索,可以找到一个具有匹配扩展方法的静态类。根据名称空间嵌套和可用进行搜索。using每个命名空间中的指令。这意味着为了正确解析动态扩展方法调用,dlr必须知道在运行时所有的命名空间嵌套和using指示在你的源代码中..我们没有方便地将所有这些信息编码到呼叫站点的机制。我们曾考虑发明这样一种机制,但认为成本太高,产生的进度风险太大,不值得。

守着星空守着你

因为First()不是.的方法List..它在Linq扩展中定义为IEnumerable<>
随时随地看视频慕课网APP
我要回答