【问题标题】:Extension-methods VS static method resolution - what do I miss in spec?扩展方法 VS 静态方法解析 - 我在规范中遗漏了什么?
【发布时间】:2010-09-08 10:37:33
【问题描述】:

我添加了一个扩展方法,它是 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(字符串,参数 object[])' 不能用 实例参考;用一个限定它 改为输入名称

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

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

【问题讨论】:

  • 编译错误信息是什么?
  • 谢谢。我在根问题中添加了错误消息。

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


【解决方案1】:

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

只有在没有找到适用的函数成员时才搜索扩展方法。

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

【讨论】:

  • 如果适用!=可编译 - 那么这是合乎逻辑的。我同意。不过,如果这样的捷径能奏效会更好:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2018-07-06
  • 2015-03-28
相关资源
最近更新 更多