2013-06-24 2 views
19

У меня есть метод расширения какВызов неоднозначен между один метод метод расширения т.е.

public static class Extension 
{ 
    public static string GetTLD(this string str) 
    { 
     var host = new System.Uri(str).Host; 
     int index = host.LastIndexOf('.'), last = 3; 
     while (index >= last - 3) 
     { 
      last = index; 
      index = host.LastIndexOf('.', last - 1); 
     } 
     var domain = host.Substring(index + 1); 
     return domain; 
    } 
} 

И я называю это как

string domain = "." + _url.GetTLD(); 

Я не подвожу нет ошибки при строительстве и чистой сборки.
Но я получаю compilation error на ошибки времени выполнения говоря

Вызов неоднозначен между следующими методами или свойствами: «myIGNOU.Extension.GetTLD (строки)» и «myIGNOU.Extension.GetTLD (струнные) '

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

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

Here is compilation error page

+0

Какой тип _url? Кроме того, вы пытались удалить метод? –

+0

@newStackExchangeInstance Его 'строка'. И Да, я пробовал удалить этот метод. При удалении он дает ошибку при построении, но не во время выполнения – shashwat

+1

Не могли бы вы показать ** все ** сведения об исключении? –

ответ

12

Это не реальное решение, и я не могу объяснить, как это работало, но он работал.

Я пробовал все в свойствах проекта, ссылках, bin, obj, но мне ничего не помогло. И я просто пробовал каждый вариант и выбрал «Конвертировать в веб-приложение» из контекстного меню. Хотя раньше это было веб-приложение. Он показал мне предупреждение о том, что файлы .designer.cs будут добавлены в каждый файл aspx, и я просто нажал ОК.

Все оставалось таким же, кроме папки App_Code (где все эти классы были) было переименовано в Old App_Code, и я бы построил проект. И теперь я не получаю ошибку компиляции во время выполнения.

Я знаю, что папка App_Code предназначена для веб-сайта Project, и до этого времени в WAP не было проблем с этим. Но я просто понимаю, что я не должен иметь папку App_Code в WAP, как это обсуждается здесь в wrox forum (1st point). Автор сказал здесь, что

App_Code не поддерживается в WAP. Папка App_Code скомпилирована по адресу время выполнения; весь код в WAP компилируется во время компиляции/разработки. Таким образом, когда вы добавляете папку App_Code в WAP. вы в итоге получаете дублирующий код; например, класс, определенный в App_Code, также будет отображаться в DLL-библиотеке . Исправить легко: просто назовите папку что-то еще, например Классы или CodeFiles.

Я пробовал переименовать его до преобразования, но в то время он не работал.

53

У меня была такая же проблема, но для меня она решила проблему, чтобы удалить собственный проект из ссылок на проект. Resharper случайно добавил ссылку на скомпилированный двоичный файл того же проекта. Таким образом, у меня был один и тот же класс расширения 2 раза в рамках моего проекта. Во время строительства он не мог отличить исходную версию или двоичную версию класса расширения.

Итак, в основном: проверьте ссылки на проект, если он содержит ссылку на себя.

Ответ, предоставленный @shashwat, также является случаем.

+5

У меня было «двусмысленное» сообщение о компиляции, и ваш ответ решил это для меня. Проект ссылается на себя, когда я проверяю ссылку «Ссылки». его удаление позволяет скомпилировать его снова. – Hafiz

+2

Это настолько озадачивает, что я нашел ваш ответ здесь. Спасибо, Danielku15. – Blaise

+0

Спасибо большое! Это тоже было мое дело, но интересная часть, что я не использую Resharper, у меня есть Devexpress Code Rush, но я не могу сказать, как появилась эта самореклама ... нет доказательств, чтобы обвинять Code Rush. – Prokurors

1

У меня была такая же ситуация. У меня был настраиваемый элемент управления сеткой, для которого был метод расширения. Метод был объявлен только в одном месте. Элемент управления использовался во многих местах в моем решении без проблем. Затем в один прекрасный день я скопировал элемент управления, который реализовал пользовательский контроль сетки, буквально копируя и вставляя его в один и тот же проект. Затем я просто переименовал свойства по мере необходимости. После этого решение не будет строить, цитируя ту же ошибку, что и выше. Я подозреваю, что копия и вставка добавили в проект ссылку на себя.

Удаление проблемы устранено.

0

Моя проблема была похожа на то, что описывает шашват. В моем случае я помещал файл кода в директорию App_Code, но для того, чтобы получить intellisense, я сам установил сам файл, который, вероятно, означает, что файл компилируется как во время выполнения, так и во время компиляции. Я просто перенес файл из App_Code.

2

У меня была та же проблема. После некоторых исследований и экспериментов я обнаружил, что (по какой-либо причине) визуальная студия не любит методы расширения в папке App_Code. Самое простое решение, которое я нашел, это просто изменить имя папки.

0

Я нашел это решение в комментариях выше. И это помогло мне.

У меня есть ссылка на проект A в проекте A. По ошибке.

Устранение помогает =)