ошибка сборки компилятора: вызов неоднозначен между следующими методами или свойствами - PullRequest
13 голосов
/ 13 июля 2011

Я испытываю странную ошибку компилятора с методами расширения. У меня есть сборка, которая имеет метод расширения, например

public static class MyClass
{
    public static Bar GetBar(this Foo foo)
    {
        return new Bar();
    }
}

А в другом месте в той же сборке я делаю что-то вроде этого

Foo foo = new Foo();
var bar = foo.GetBar();

Когда я очищаю и компилирую, все в порядке. НО, как только я делаю небольшое изменение (например, дополнительные пробелы) в сборке и строю заново, я получаю ошибку, подобную этой:

Ошибка 973 Вызов неоднозначен между следующими методами или свойствами: 'MyNameSpace.MyClass.GetBar (Foo)' и 'MyNameSpace.MyClass.GetBar (Foo)'

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

Ответы [ 3 ]

24 голосов
/ 11 октября 2012

Мне потребовалось некоторое время, чтобы понять это, но комментарий Gluips является правильным, я добавлю его здесь для удобства:

Вот и все!Каким-то образом проект напрямую ссылался на себя.Удаление ссылки, вероятно, решает проблему.Спасибо!

Это исправило это для меня.

4 голосов
/ 13 июля 2011

Хорошо, немного поиграв, я могу воспроизвести похожую ситуацию, добавив ссылку на файл к выходному файлу - первый раз, когда он строится успешно (так как ссылка не используется - вы просто получаете ссылку) не устранено "предупреждение", однако с этого момента я вижу, что в редакторе кода появляется ошибка "Вызов неоднозначен".

Однако для меня это не помешает мне построить решение (я тестирую это с помощью Visual Studio 2010), однако ошибка все же появляется - возможно, при немного других обстоятельствах, таких как другая версия Visual Studio, это будет остановить проект от компиляции.

Эту же ситуацию можно также спроектировать с помощью шагов после сборки, которые копируют выходную сборку.

0 голосов
/ 13 июля 2011

Я не могу объяснить такое поведение, но вы должны реализовать такой метод, как static, непосредственно в Foo классе.

...