扩展方法VS静态方法解析 - 我在规范中错过了什么?

时间:2010-09-08 10:37:33

标签: c# extension-methods format static-methods

我添加了一个扩展方法,它是string.Format:

的快捷方式
public static string Format(this string format, params object[] args)
{
    return String.Format(format, args);
}

当我像这样调用这个方法时:

"{0}".Format(1);

一切都像魅力一样。 而

"{0}".Format("1"); 

无法使用此错误消息进行编译:

  

错误CS0176:会员   'string.Format(string,params   无法访问对象[])'   实例参考;用a来限定它   改为输入名称

我通过重命名方法解决了这个问题(哦,这很痛苦)。但为什么会这样呢?我知道扩展与实例优先级 - 但这不是实例方法。 IMO如果无法解析一条路径(在非静态上下文中引用静态方法),则应尝试另一条路径(完全合法)。我在规格中错过了什么?

更新1 添加了编译错误消息。

1 个答案:

答案 0 :(得分:3)

第7.5.3.1节(函数成员适用性)没有说明成员是否是静态的。换句话说,静态方法String.Format(String, params Object[] args)在您的第二次调用中仍然是适用的,即使它实际上不起作用。

仅在未找到适用的函数成员时才搜索扩展方法。

换句话说,成员查找是在类型和一组参数(以及可能的类型参数)上执行的。成员查找结果的验证将在稍后完成,作为7.6.5.1节的最后一步。