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

#c# #namespaces

#c# #пространства имен

Вопрос:

В моем решении есть один проект, направленный на предоставление некоторой базовой функциональности. Это пространство имен MyCompanyName.ProductName.FunctionSet . На данный момент этот проект включает в себя два класса; customer.cs и core.cs . Основной класс является статическим и содержит статический метод EntryPoint().

У меня есть консольное приложение в решении. Его пространство имен MyCompanyName.ProductName.TaskMan . Я создал ссылку на основной проект выше и добавил директиву using для пространства имен.

Одна из строк в Main() является Core.EntryPoint(); . Обратите внимание, оно не включает в себя какую-либо часть пространства имен. Код работал нормально.

Теперь, чтобы устранить ошибку (не удается разрешить символ ‘EntryPoint’) Мне нужно было изменить строку на FunctionSet.Core.EntryPoint(); . Мне нужно было добавить последнюю часть пространства имен.

Зачем мне нужно было добавлять эту часть пространства имен? Есть идеи, почему это внезапно перестало работать? Могу ли я что-нибудь сделать, чтобы исключить часть пространства имен? Это не имеет большого значения, если я застрял на этом, но я действительно хочу знать, как и почему.

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

1. Не могли бы вы включить свои using инструкции?

2. Я предполагаю, что это потому, что оно конфликтует с другим классом, таким как Core. Попробуйте присвоить вашей ссылке псевдоним и посмотрите, работает ли это: используя fs = MyCompanyName . ProductName. Набор функций; а затем доступ к нему через fs. Ядро и т.д.

3. Я предполагаю, что вы добавили ссылку на другое пространство имен, которое также содержит класс с именем Core. (Возможно, класс .Net Framework)

Ответ №1:

РЕДАКТИРОВАТЬ: я сохранил большую часть ниже, но теперь я не уверен, что это актуально.

Я подозреваю, что одно из них верно:

  • Ваши пространства имен не совсем такие, какими вы их считаете (в частности, для Core)
  • У вас нет директивы using, которая, как вы думаете, у вас есть

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


Пространства имен не разрешаются относительно using директив, хотя они разрешены относительно текущего пространства имен. Например:

 namespace Outer.Inner
{
    class Foo
    {
        public static void Bar() {}
    }
}

namespace Outer.OtherInner
{
    class Test1        
    {
        static void Method()
        {
            // Resolved to Outer.Inner.Foo.Bar()
            Inner.Foo.Bar();
        }
    }
}

namespace OtherOuter
{
    using Outer;

    class Test2
    {
        static void Main()
        {
            // This is invalid
            Inner.Foo.Bar();
        }
    }
}
  

Для получения полной информации смотрите раздел 3.8 спецификации C #.

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

1. Пространство имен для Core.cs было xxx.xxx.Core. Где-то по пути мы переименовали некоторые материалы. Я не уверен, почему я не понял этого раньше. После переименования Core.cs в Test.cs проблема стала очевидной. Спасибо!

2. @SpecialAgent_W436: Базовый класс находился в основном пространстве имен? Это определенно плохая идея — см. blogs.msdn.com/b/ericlippert/archive/2010/03/09 /… и последующие части.

3. Да, именно это и произошло. Спасибо за ссылку.

Ответ №2:

Вы пробовали добавлять функцию в инструкцию using в начале файла?

 using FunctionSet.Core.EntryPoint
EntryPoint();