我将在以下代码段中总结我的问题。
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
上面的代码工作正常。
现在我尝试了以下
dynamic dList = list;
Console.WriteLine(dList.First());
但是我正在得到RuntimeBinderException。为什么会这样呢?
我将在以下代码段中总结我的问题。
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
上面的代码工作正常。
现在我尝试了以下
dynamic dList = list;
Console.WriteLine(dList.First());
但是我正在得到RuntimeBinderException。为什么会这样呢?
this
这里动态,但是如果您登陆这里,您可能也应该看看这个问题
Answers:
为了扩展Stecya的答案...动态类型不以扩展方法的形式来支持扩展方法,即,将其称为实例方法。但是,这将起作用:
dynamic dList = list;
Console.WriteLine(Enumerable.First(dList));
当然,这可能有用也可能没有用。如果您可以提供有关为什么以及如何尝试使用动态类型的更多信息,我们可能会提供更多帮助。
dynamic
在您真正需要的地方使用...基本上,如果您否则需要通过反思来访问成员,那是一个很大的信号。另一方面,我是一位顽固的静态打字员-其他人可能建议采取较少悲观的政策:)
为了扩展Jon的答案,之所以不起作用,是因为在常规的非动态代码扩展方法中,通过对编译器已知的所有类进行完整搜索以找到具有匹配的扩展方法的静态类,从而可以正常工作。搜索是基于名称空间嵌套和using
每个名称空间中的可用指令的顺序进行的。
这意味着为了正确解决动态扩展方法调用,DLR必须在运行时以某种方式知道源代码中所有名称空间的嵌套和using
指令是什么。我们没有方便的机制将所有这些信息编码到呼叫站点中。我们考虑过发明这样一种机制,但是认为它成本太高,并且产生了太多计划风险,因此不值得。
dynamic
对象都等于C#:,DynamicObject
所以没有办法区分它们,这是为什么无法向加上扩展方法的原因之一dynamic
,对吗?