Ответ 1
Вы не можете вызвать метод расширения как обычный метод расширения. Метод экземпляра переопределяет метод расширения с той же сигнатурой
ИЗМЕНИТЬ:
Вы можете назвать его статическим методом
ExtensionTest.MethodA(a);
Возможный дубликат:
Есть ли способ в С# переопределить метод класса с помощью метода расширения?
У меня есть код вроде
public class TestA
{
public string ColA { get; set; }
public string ColB { get; set; }
public string ColC { get; set; }
public void MethodA()
{
MessageBox.Show("Original A1.");
}
}
static class ExtenstionTest
{
public static void MethodA(this TestA A1)
{
MessageBox.Show("Extended A1.");
}
}
Теперь, если я вызываю MethodA как
TestA a = new TestA();
a.MethodA();
Он всегда будет вызывать метод Original. Как я могу вызвать метод расширения.
Вы не можете вызвать метод расширения как обычный метод расширения. Метод экземпляра переопределяет метод расширения с той же сигнатурой
ИЗМЕНИТЬ:
Вы можете назвать его статическим методом
ExtensionTest.MethodA(a);
Вы не можете назвать его как метод расширения. В настоящее время это бесполезно, поскольку это метод расширения. (Лично мне хотелось бы, чтобы это было предупреждением, но неважно.)
Компилятор пытается использовать все возможные методы экземпляра, прежде чем пытается разрешить методы расширения. Из раздела 7.6.5.2 спецификации С# 4:
При вызове метода одной из форм [...], если нормальная обработка f вызывает неприемлемые методы, делается попытка обработать конструкцию как вызов метода расширения.
и позже:
Предыдущие правила означают, что методы экземпляра имеют приоритет над методами расширения
Вы можете называть его как обычный статический метод:
// Fixed typo in name
ExtensionTest.MethodA(a);
Метод расширения с тем же именем и подписью как интерфейс или метод класса никогда не будут называться. Во время компиляции, методы расширения всегда имеют более низкий приоритет, чем методы экземпляра, определенные в самом типе.
Вы можете вызвать метод расширения как обычный статический метод класса.
ExtenstionTest.MethodA(a);
Из MSDN
Другими словами, если тип имеет метод Process (int i), и вы имеют метод расширения с той же сигнатурой, компилятор будет всегда привязывайтесь к методу экземпляра. Когда компилятор сталкивается с вызов метода, он сначала ищет совпадение в экземпляре типа методы. Если совпадение не найдено, оно будет искать любое расширение методы, определенные для типа, и привязка к первому расширению метод, который он находит. В следующем примере показано, как компилятор определяет, какой метод расширения или метод экземпляра связывать к.
Вы можете вызвать метод расширения как любой другой статический метод:
ExtenstionTest.MethodA(a);
поскольку другие предположили, что вы не можете назвать этот метод. Единственный способ его вызова таков:
TestA a = new TestA();
ExtenstionTest.MethodA(a);