VS2010 показывает, что неявная переменная имеет тип «var» вместо фактического типа

Я не уверен, если это ошибка или что-то еще.

Я создаю новый проект веб-приложения в VS2010. В проекте я создаю новый класс (Class1) со следующим содержимым:

public void Test()
{
    var s = "Hello";
    Console.WriteLine(s);
}

Когда я навожу указатель мыши на s в строке Console.WriteLine(s), появляется всплывающее окно, показывающее (local variable) string s. Отлично, как я и ожидал.

Правильно показано, что s имеет тип string

Теперь я добавляю в проект папку App_Code. Внутри него я снова создаю новый класс (Class2) с точно таким же содержимым (кроме имени класса). Теперь при наведении курсора на s отображается (local variable) var s.

Неправильно показано, что s имеет тип var

Почему вместо string показывает var? Это ошибка? Можете ли вы воспроизвести это поведение?

Это еще хуже. Если я перемещу Class2.cs из папки App_Code в корень проекта, VS2010 все равно не покажет этот тип. Даже после перезапуска VS2010 и повторного открытия проекта VS2010 покажет правильный тип в Class1, но не в Class2. Я также пытался удалить файлы .suo и .csproj.user, но безрезультатно. Очевидно, VS2010 где-то кэширует эту информацию.


person comecme    schedule 06.05.2012    source источник
comment
Есть ли другие отличия в файлах? Использование? что-то другое? Что произойдет, если вы скопируете и вставите одно или другое и просто переименуете класс?   -  person Andrew Barber    schedule 06.05.2012
comment
Что ж, если в файлах нет различий, у вас конфликтующие определения; то есть не компилируется. Тот факт, что он показывает вам что-либо в любом файле, удивителен.   -  person user541686    schedule 06.05.2012
comment
Вот почему лучше не использовать неявные типы. Ошибка или нет, я считаю, что легче читать, если тип используется явно.   -  person Bernard    schedule 06.05.2012
comment
это происходит даже после перестроения проекта?   -  person    schedule 06.05.2012
comment
@Mehrdad: Почему это может привести к противоречивым определениям? Как я уже сказал, первый файл Class1, второй файл Class2.   -  person comecme    schedule 06.05.2012
comment
@comecme: никого не волнует имя файла. Важным моментом является имя класса. Ваш проект строится?   -  person user541686    schedule 06.05.2012
comment
@Mehrdad: первый файл содержит класс Class1, второй файл содержит класс Class2. Вот что я сказал: я создаю класс.   -  person comecme    schedule 06.05.2012
comment
@comecme: Ооо... просто чтобы проверить, проект собирается, верно?   -  person user541686    schedule 06.05.2012
comment
@Mehrdad: Да, код собирается. Но на самом деле я ничего не делаю с классами. Я только что попытался создать их экземпляры, и Class2 не удалось найти.   -  person comecme    schedule 06.05.2012
comment
@comecme: Хмммм, тогда это действительно странно, эй, извини.   -  person user541686    schedule 06.05.2012


Ответы (2)


Каталог App_Code — это специальный каталог для проектов веб-сайта.

В проектах веб-приложений код, помещенный в каталог App_Code, игнорируется VS.

Я заметил это поведение при переносе веб-сайта в проект веб-приложения.

person devio    schedule 06.05.2012
comment
Это интересно. Если я создаю проект веб-сайта, Class2 в папке App_Code работает так, как я ожидаю. Наведение курсора на s показывает, что это string. Я не думаю, что код внутри App_Code игнорируется в проекте веб-приложения. Мой код работал нормально, просто IDE не показывала тип переменной. - person comecme; 06.05.2012

Я думаю, что это происходит из-за папки App_Code. Потому что папка App_Code компилируется во время выполнения. Как MSDN описывает здесь.

В проекте веб-сайта вы можете хранить исходный код в папке App_Code, и он будет автоматически скомпилирован во время выполнения. Полученная сборка доступна для любого другого кода в веб-приложении. Таким образом, папка App_Code работает так же, как папка Bin, за исключением того, что вы можете хранить в ней исходный код вместо скомпилированного кода. Папка App_Code и ее особый статус в веб-приложении ASP.NET позволяют создавать пользовательские классы и другие файлы только с исходным кодом и использовать их в веб-приложении без необходимости их независимой компиляции.

Вот ссылка на MSDN

person jams    schedule 06.05.2012
comment
Это не совсем ответ на мой вопрос. Да, вероятно, это как-то связано с папкой App_Code, поскольку проблема возникает только в файле класса внутри этой папки. Основываясь на ответе devio, я обнаружил, что внутри проекта веб-сайта проблема не возникает. Таким образом, вы можете использовать App_Code внутри проекта веб-приложения, но вы не должны этого делать. - person comecme; 06.05.2012