Странное поведение проекта WPF (именование классов) - PullRequest
1 голос
/ 25 марта 2011

Я получил странную ошибку при попытке построить мой проект ExpertSystem в решении ExpertSystem:

Ошибка 1 Имя типа «Приложение» не существуют в типе 'ExpertSystem.ExpertSystem' D: \ Users \ Кирилл \ Documents \ Visual студия 2010 \ Projects \ ExpertSystem \ ExpertSystem \ obj \ x86 \ Debug \ App.g.cs 60 26 ExpertSystem

Я даже не знал, что VS создает этот файл при сборке. Итак, я начал искать проблему в моих последних изменениях в коде и обнаружил, что проблема в моем последнем классе:

namespace ExpertSystem
{
    public class ExpertSystem
    {
    //...
    }
}

Когда имя класса изменяется на что-то отличное от ExpertSystem, проект компилируется без ошибок.

Может кто-нибудь объяснить, могу ли я на самом деле иметь классы в C # с тем же именем, что и пространство имен / проект / решение? Или это какая-то ошибка VS / WPF?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 25 марта 2011

VS генерирует частичный класс для каждого файла XAML (не во время сборки, а во время проектирования), чтобы (например) объявить и заполнить именованные компоненты как поля класса.

Если вы хотите легко прочитать содержимое сгенерированного дизайнером файла App.g.css (связанного с файлом App.xaml и App.xaml.cs), перейдите в файл App.xaml.cs и выполните " Перейти к определению "при вызове функции InitializeComponent () в конструкторе класса. Я не знаю, что скрывается в вашем, но я ожидаю, что дизайнер сгенерировал что-то вроде этого (возможно, не это, но проблема будет та же):

var foo = (SystemExpert.App)(Application.Current)

Что следует понимать как:

var foo = (global::SystemExpert.App)(Application.Current)

Теперь, если вы создадите класс SystemExpert в своем пространстве имен сборки SystemExpert, и, поскольку класс App также объявлен в пространстве имен SystemExpert, компилятор поймет, что:

var foo = (global::SystemExpert.SystemExpert.App)(Application.Current)
            ^^^^^^^^^^^^^^^^
         the current namespace

Называть класс точно так же, как пространство имен, - плохая практика: это может запутать компилятор.

4 голосов
/ 25 марта 2011

Может кто-нибудь объяснить, могу ли я на самом деле иметь классы в C # с тем же именем, что и пространство имен / проект / решение?

Да, вы можете.Это часть языка C #.

Поэтому компилятор не может выяснить, предназначен ли код для поиска пространства имен ExpertSystem.ExpertSystem или класса ExpertSystem в пространстве имен ExpertSystem.(Ну, может, но ошибся.)

1 голос
/ 03 июня 2015

Для дополнения ответа BoltClock решением, которое будет работать при сохранении имен и пространств имен такими, как они есть:

Ошибка сообщается в файле с именем App.g.cs, который генерируется компилятором. Таким образом, исправление проблемы в этом файле не поможет, поскольку файл будет перезаписан с ошибкой при следующей компиляции (или перезаписан после того, как вы скопировали код на другую машину).

Однако, вы можете изменить файл App.xaml, из которого создается App.g.cs. Корневой элемент файла будет начинаться с чего-то вроде

<Application x:Class="ExpertSystem.App"

Там должно быть найдено пространство имен ExpertSystem, но с классом с таким же именем компилятор предполагает, что App является членом или вложенным типом в вашем классе ExpertSystem.ExpertSystem.

Обдумав это, вы поймете, что компилятор сначала пытается по какой-то причине оценить значение атрибута x:Class относительно пространства имен ExpertSystem. Это поведение ответственно за вашу проблему, но, поскольку теперь мы знаем особенности поведения, мы можем написать соответствующий код - с идентификатором, который квалифицирован относительно пространства имен ExpertSystem:

<Application x:Class="App"

После этого изменения он должен скомпилироваться нормально, даже если пространство имен и класс названы ExpertSystem.

...