Методы расширения в C #: почему это работает? - PullRequest
3 голосов
/ 21 августа 2010

Я немного запутался, почему это не дает ошибки. Я нашел этот код глубоко внутри устаревшего программного обеспечения и с удивлением увидел, как он работает.

public static string CleanFileName(this string fileName)
{
  return CleanFileName(fileName, 64);
}

public static string CleanFileName(this string fileName, int maxLength)
{
  //some logic
}

Мой опыт работы с методами расширения таков:

fileName.CleanFileName(64);

Это работает только потому, что это статический метод? Это обычная практика и просто что-то, чего я еще не видел, или устаревший унаследованный код, который я должен убить огнем?

Ответы [ 2 ]

10 голосов
/ 21 августа 2010

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

Другой ответ вводит в заблуждение, потому что «он работает, потому что вызов метода выполняется из того же типа, что и его перегрузка».подразумевает что-то о методах расширения.Вы можете вызывать методы расширения как обычные статические методы независимо от того, в каком классе вы находитесь. Но из приведенных ниже комментариев кажется, что путаница заключается в том, должен ли класс быть квалифицированным или нет.И в этом ключе Натан прав, что причина, по которой имя класса может быть исключено, заключается в том, что вызов происходит из того же класса, что и перегрузка.

6 голосов
/ 21 августа 2010

Это работает, потому что вызов CleanFileName(string, int) выполняется из того же типа, что и CleanFileName(string), что позволяет выполнять вызов в стандартном синтаксисе метода, а не в синтаксисе метода расширения. Таким образом, префикс экземпляра строки не требуется перед методом расширения.

Семантически говоря, static string Foo(this string foo, int bar) { } можно назвать в форме Foo(string, int) или string.Foo(int).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...