Подтвердить что ты не робот

Вызов неоднозначен между следующими методами или свойствами (ошибка?)

  • Создайте новую веб-страницу ASP.NET MVC Применение
  • Создать ASP.NET App_Code  Папка
  • Внутри нового папку, создайте класс с Метод расширения. Например:

    static public class BugMVCExtension
    {
        public static int ToInt(this string str)
        {
            return Convert.ToInt32(str);
        }
    }
    
  • Выберите вид и попробуйте использовать этот новый метод расширения

Вы получите это исключение:

CS0121: The call is ambiguous between the following methods or properties:
'*MvcApplication1.App_code.BugMVCExtentions.ToInt(string)*' and
'*MvcApplication1.App_code.BugMVCExtentions.ToInt(string)*'

У кого-нибудь есть больше информации об этом? Неправильно ли создавать App_code в веб-приложениях ASP.NET MVC (?)?

4b9b3361

Ответ 1

Проекты MVC, созданные в Visual Studio, используют модель проекта веб-приложения по умолчанию. App_Code в основном используется моделью веб-сайта. Я предлагаю прочитать о различиях между ними (другой вопрос охватывает этот вопрос, а также широко распространяется на MSDN). Если вы добавляете исходный файл в App_Code в проект веб-приложения, Visual Studio будет компилировать его в DLL (так как он включен в проект) и помещает его в /bin. Во время выполнения компилятор ASP.NET видит App_Code и пытается скомпилировать источник в другой сборке. Как следствие, два разных класса с одинаковыми именами будут существовать в двух разных сборках, и когда парсер ASP.NET попытается скомпилировать файл .aspx, он не сможет выбрать его.

Обновление:

Являются ли эти два (метод расширения и класс, который вы создаете) в одном файле .cs? В противном случае, возможно, создаваемый вами класс находится в исходном файле с Строить действие (щелкните правой кнопкой мыши по файлу, щелкните свойства), установленным в Контент, который сообщает Visual Studio пропустить он в процессе сборки (в этом случае вы не сможете ссылаться на него в других файлах .cs, которые находятся за пределами App_Code, но вы сможете использовать его в представлении, поскольку он только оживет во время выполнения.) Если действие сборки Компилировать, вы получите сообщение об ошибке. Эта проблема определенно не специфична для методов расширения. Visual Studio кажется достаточно умным, чтобы установить его в Content по умолчанию для исходных файлов, добавленных в App_Code.

Ответ 2

Не используйте папку app_code.

Используйте любое другое имя папки. IE. appCode или ApplicationsCode.

Имя в папке подразумевает компиляцию во время выполнения, что приводит к дублированию кода.

Ответ 3

Я решил, разместив в файле расширение полного пространства имен папки.

пространства имен Помощники {

namespace xxx.yyy.zzz.Helpers {

Ответ 4

Я решил проблему, поместив файл .cs вне папки App_Code в корневом каталоге веб-приложения.