Метод расширения и обычный метод => Ошибка? - PullRequest
0 голосов
/ 23 октября 2010

У меня есть два метода, которые идентичны.один -

    public void ExtendFrameIntoClientArea(Window w, int amount)
    {
        if (internals.DwmIsCompositionEnabled())
        {
            WindowInteropHelper wi = new WindowInteropHelper(w);
            internals.DwmExtendFrameIntoClientArea(wi.Handle, new internals.MARGINS(amount));
        }
    }

, а другой -

public void ExtendFrameIntoClientArea(this Window w,int amount)
        {
            this.ExtendFrameIntoClientArea(w, amount);
        }

Один из них является методом расширения, а другой - нет.Это, однако, приводит к ошибке «Этот вызов неоднозначен»

Как бы я обойти это?

Ответы [ 3 ]

3 голосов
/ 23 октября 2010

Методы расширения должны быть статическими.

public static class XExtender
{
    public static void A(this X x)
    {
        x.A(x);
    }
}
public class X
{
    public void A(X x)
    {

    }
}

Методы расширения должны иметь статический класс и статический метод.

1 голос
/ 23 октября 2010

Согласно спецификации C # версии 3.0 , порядок поиска имеет вид:

  • метод экземпляра в определении типа
  • метод расширенияв текущем пространстве имен
  • метод расширения в родительских пространствах текущего пространства имен
  • метод расширения в других пространствах имен, импортированных с помощью «using»

Итак, как вы объявили свои методыа где?

0 голосов
/ 23 октября 2010

Я думаю, что ошибка не вызвана методом расширения.

Во-первых, метод расширения

public static void ExtendFrameIntoClientArea(this Window w, int amount) { }

(кстати, вы пропустили модификатор static) было бы неоднозначно с методом экземпляра

public void ExtendFrameIntoClientArea(int amount) { }

объявлено в классе Window, но не с методом экземпляра

public void ExtendFrameIntoClientArea(Window w, int amount) { }

независимо от того, в каком классе он объявлен. Кроме того, насколько я помню, методы экземпляра имеют приоритет перед методом расширения, поэтому они никогда не должны быть неоднозначными с методами расширения. Я предлагаю еще раз взглянуть на сообщение об ошибке и убедиться, что вы используете правильные методы.

...