То, что вы пытаетесь сделать, запрещено. В статье о методе расширения MSDN C # конкретно указано, что:
Вы можете использовать методы расширения для расширения класса или интерфейса, но не для их переопределения. Метод расширения с тем же именем и сигнатурой, что и у интерфейса или метода класса, никогда не будет вызываться. Во время компиляции методы расширения всегда имеют более низкий приоритет, чем методы экземпляра, определенные в самом типе.
Слава Богу, это не разрешено, так как это было бы ужасно, поддерживать.
РЕДАКТИРОВАТЬ: Итак, люди говорят, что статические методы не являются методами экземпляра, и это правильно. Но попробуйте сделать это:
class A
{
public static void Foo() {}
public void Foo() {}
}
Это не скомпилируется из-за неоднозначности имени. Это именно то, что произошло бы, если бы вам было разрешено использовать метод расширения. Это внесло бы точно такую же двусмысленность. Теперь, учитывая, что один метод является статическим, а другой - экземпляром, это может означать, что двусмысленности, возможно, нет. Но в текущем состоянии это вносит двусмысленность, которая является еще одной причиной, почему это не будет разрешено.
Редактировать # 2: Из комментария @ErenErsonmez сделал:
Однако, пока метод расширения не имеет той же сигнатуры, что и метод экземпляра, я не понимаю, как он может вызвать неоднозначность при использовании статического метода
Если вы измените сигнатуру метода расширения, он точно будет работать. Таким образом, будет работать следующее:
class A
{
public static void Foo() { }
}
static class Ext
{
public static void Foo(this A me, int i)
{ }
}
class Program
{
static void Main(string[] args)
{
A a = new A();
a.Foo(10);
Console.ReadLine();
}
}
Так что, похоже, проблема в неоднозначности, а не в том, что никогда не может быть метода расширения с тем же именем, что и метод, который уже существует.