c# - C#:为什么我不能在扩展方法中使用动态参数?
问题描述
为什么不能在扩展方法中使用动态参数,如下代码:
public static class Extension
{
public static void ExtMethod(this Program pg, object asdf) {
new Program();
}
}
public class Program
{
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
d.test = "test";
new Program().ExtMethod(d.test);
Extension.ExtMethod(new Program(), d.test);
}
}
new Program().ExtMethod(d.test);
正在引发编译时错误。
但Extension.ExtMethod(new Program(), d.test);
不会导致任何错误。
解决方案
这是设计使然,也是规范的一部分。从 ECMA C# 5 标准,第 12.7.6.3 节:
在一种形式的方法调用(第 12.6.6.2 节)中[...],如果调用的正常处理没有找到适用的方法,则会尝试将构造作为扩展方法调用进行处理。如果
expr
或任何 args 具有编译时类型动态,则扩展方法将不适用。
其根本原因是动态绑定旨在提供与编译时绑定相同的结果……但对于扩展方法,这意味着using
在执行时保留所有指令。这是可能的,但我怀疑在调用性能方面会非常昂贵,C# 设计团队决定不这样做。
推荐阅读
- sql - 如何在 SQL 中将 JSON 值展平为频率计数
- git - 使用 ssh 进行 git clone 时出现“连接超时”
- regex - REGEXEXTRACT 多个值 - Google 表格
- c# - 调用 GetAzureADAppOnlyAuthenticatedContext 时无法加载文件或程序集“Microsoft.IdentityModel.Clients.ActiveDirectory”
- blogdown - 更改锂主题中图形的显示属性
- javascript - 如何使用 npm 更新依赖项的依赖项
- r - R:创建给定列的所有可能组合
- php - 更改推文中的 Twitter 日期格式
- javascript - 无法在 React 中编辑输入元素的值
- javascript - nodejs中长时间运行的请求