2009-11-19 2 views
3

Использование .NET 2.0, C#, разработка Windows Forms, корпоративная библиотека 3.1.C#. NET. Имя пространства имен не существует в ошибке пространства имен - только при использовании вне директивы локального пространства имен - почему?

У нас есть пространство имен проектов (назовите его проектом). У нас также есть несколько подпространств имен внутри этого проекта, например Project.Namespace1, Project.Namespace2 и т. Д.

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

namespace Project.Logging 
{ 
    public static class Logging 
    { 
    public enum LogPriority 
    { 
     // enum values here 
    } 
    } 
} 

В другом классе я использую значения перечисления, поэтому мне нужно объявить инструкцию using. Тот же проект, поэтому нет ссылки на ссылку, верно?

Если я объявляю, используя внутри локального пространства имен, как это, она отлично работает:

namespace Project.SomeName 
{ 
    using Project.Logging; 

    // code referencing the Logging enum 
} 

Однако, если я ставлю используя заявление вне локальной декларации пространства имен, я получаю «тип или пространство имен «LogPriority» не существует в пространстве имен «Project.Logging» ... Как это:?

using Project.Logging; 

namespace Project.SomeName 
{ 
    // code referencing the Logging.LogPriority.whatever 
} 

Почему это кто-нибудь запустить через это раньше

+0

Не могли бы вы отправить код, который ссылается на перечисление LogPriority для обоих случаев?Перечисление определено внутри класса, и я думаю, что это может быть проблемой. – shahkalpesh

ответ

2

Я столкнулся с аналогичными (хотя и не совсем такими же) проблемами перед тем, как использовать класс с тем же именем, что и его пространство имен.

Как ни странно, казалось, что компиляция одобрена на некоторых компьютерах разработчиков, но не на других. В итоге мы убедились, что в пространстве имен не содержится класс с тем же именем.

namespace Project.Logging 
{ 
    public static class Logging // this is what caused the probems for me 
    { 

    } 
} 
+0

Это определенно то, что нужно посмотреть. Это, похоже, не проблема, но, возможно, это может создать реальную проблему когда-нибудь позже. – DaveN59

+0

В принципе, не называйте класс тем же, что и пространство имен, в котором оно находится, тогда проблема исчезает. – Timwi

1

Ye? s, скорее всего, у вас есть необычное значение, установленное для «По умолчанию пространство имен» в ваших свойствах проекта. Я бы подтвердил конфигурацию проекта.

+0

По умолчанию пространство имен - это «Проект» (следующий пример, который я опубликовал ранее), так что это вряд ли будет. Отличная идея. – DaveN59

+0

Кто имеет право голоса? – thumbmunkeys

-1

Это определенно может иметь значение, если у вас есть использование внутри или вне пространства имен. Существует хорошая дискуссия here, и это, скорее всего, связано с настройками пространства имен по умолчанию.

+0

Эта запись была именно тем, что я искал. Мы также используем StyleCop, и он жаловался на это. До этого концерта я никогда не слышал/использовал StylecCop, поэтому мне никогда не приходило в голову использовать директивы using внутри пространства имен. – DaveN59

+0

В этом ответе не упоминается, что исходная проблема была вызвана классом с тем же именем, что и его пространство имен. – Timwi

0

Мы столкнулись с этой проблемой раньше, и все пошло вниз к неоднозначному называние имен и имени класса.

Когда мы пытались иметь наше пространство имен, как Services.Web.xxx, а также добавить в справочнике услуг, как Services.Web.xxxx, а также добавить ссылки на сборку, которая была названа Services.Web.xxx вы можете только представить себе проблемы, мы столкнулись.

В конце концов, чтобы исправить это мы просто переименование, чтобы убедиться, что существует только один экземпляр Services префикса

Также вы можете сделать следующее и создать псевдоним для LogPriority к LogEnum:

using LogEnum= Project.Logging.Logging.LogPriority; 

namespace Project.SomeName 
{ 
    internal class MyClass 
    { 
     public MyClass() 
     { 
      LogEnum enum1 = LogEnum.None; 
     } 
    } 
} 
namespace Project.Logging 
{ 
    public static class Logging 
    { 
     public enum LogPriority 
     { 
      None, 
      Default 
     } 
    } 
} 
2

У меня также была проводная ошибка. Я не могу найти какое-либо пространство имен, которое происходит из разных сборок, но начинается с выполнения имени сборки. Наконец, я узнал, что я установил целевую структуру для профиля клиента .NET framework.

Смежные вопросы