我添加了一个扩展方法,它是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 添加了编译错误消息。
答案 0 :(得分:3)
第7.5.3.1节(函数成员适用性)没有说明成员是否是静态的。换句话说,静态方法String.Format(String, params Object[] args)
在您的第二次调用中仍然是适用的,即使它实际上不起作用。
仅在未找到适用的函数成员时才搜索扩展方法。
换句话说,成员查找是在类型和一组参数(以及可能的类型参数)上执行的。成员查找结果的验证将在稍后完成,作为7.6.5.1节的最后一步。