Почему я не могу объявить оператор using для пространства имен, но могу напрямую объявить пространство имен перед типом?

#c# #.net

#c# #.net

Вопрос:

Мне интересно, видел ли кто-нибудь этот сценарий раньше или имеет какие-либо предложения относительно того, что может быть причиной этого. У меня есть вызываемый пользовательский класс Dashboard , который существует внутри вызываемого проекта Dashboard.Data.Client . В том же проекте, если я попытаюсь сослаться на пространство имен класса, например:

 using Alliance.Dashboard.Data.Client.Models;
  

тогда я не могу использовать тип Dashboard . Однако в любом месте, которое мне нужно использовать Dashboard , я могу ввести полное имя, и оно отлично работает. Пример:

 Alliance.Dashboard.Data.Client.Models.Dashboard myDashboard = new Alliance.Dashboard.Data.Client.Models.Dashboard();
  

Несколько замечаний, я уверен, вам будет интересно:

  1. Если я просто ввожу Dashboard класс, а затем пытаюсь его разрешить, опция недоступна.

  2. Я уже сталкивался с этой проблемой раньше, если существуют конфликтующие пространства имен. В таком случае должно быть указано полное имя. Здесь это не так. Конфликтующих пространств имен нет.

  3. Другие классы отлично разрешаются в этом проекте. На самом деле, вот сценарий: из IDashboardRepository этой проблемы существует попытка объявить Dashboard так, как я описал. IDashboardRepository находится в том же проекте, но в другом пространстве имен : Alliance.Dashboard.Data.Client.Interfaces . Однако обратное работает нормально. Другими словами, я могу использовать пространство имен интерфейса в качестве оператора using внутри Dashboard , но не Dashboard внутри интерфейса без полного имени.

Для справки, вот код для моего Dashboard класса:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alliance.Dashboard.Data.Client.Models
{
    public class Dashboard
    {
        public System.Guid DashboardID { get; set; }

        public string DashboardName { get; set; }

        public byte[] Instance { get; set; }

        public bool IsDeleted { get; set; }

        public byte[] Concurrency { get; set; }
    }
}
  

Комментарии:

1. «тогда я не могу использовать панель управления типами» — какую ошибку компилятора вы получаете при попытке?

2. Что еще более важно, можете ли вы привести короткий воспроизводимый пример?

3. Есть ли у вас другой класс или что-либо еще, вызываемое Dashboard в вашем текущем пространстве имен или другом использовании импорта? Вы должны явно указать, какой из них вы хотите использовать, если он неоднозначен. Единственный способ обойти это — использовать псевдонимы этих обманщиков в using .

4. См: blogs.msdn.com/b/ericlippert/archive/2010/03/09/…

5. Черт возьми. Как я, черт возьми, это пропустил? Я собираюсь спрыгнуть с долбаного моста. Вы можете серьезно начать говорить обо мне в прошедшем времени. Вы, ребята, сразу привели меня к этому. Проблема в том, что имя класса и имя проекта идентичны. Компилятор думает, что я начал вводить начало пространства имен вместо имени класса. Я долбаный идиот. Извините за беспокойство.

Ответ №1:

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