Методы расширения VS Разрешение статического метода - что мне не хватает в спецификации? - PullRequest
1 голос
/ 08 сентября 2010

Я добавил метод расширения, который является ярлыком для строки. Формат:

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 object [])' не может быть доступен с экземпляромссылка;вместо этого уточните имя типа

Я исправил эту проблему, переименовав метод (о, это было больно).Но почему это происходит?Я знаю о расширении против приоритета экземпляра - но это не метод экземпляра.И IMO, если один путь не может быть разрешен (ссылается на статический метод в нестатическом контексте), тогда следует попытаться использовать другой (полностью легитимный).Что мне не хватает в спецификации?

Обновление 1 Добавлено сообщение об ошибке компиляции.

1 Ответ

3 голосов
/ 08 сентября 2010

В разделе 7.5.3.1 (применимость члена функции) ничего не говорится о том, является ли член статическим или нет.Другими словами, статический метод String.Format(String, params Object[] args) все еще применим при вашем втором вызове, даже если он на самом деле не будет работать.

Методы расширения ищутся только в том случае, если нет применимых членов функциинайдены.

Другими словами, поиск члена выполняется для типа и набора аргументов (и, возможно, аргументов типа). проверка результата поиска члена выполняется позже, как последний шаг раздела 7.6.5.1.

...