Абсолютная/внешняя и внутренняя путаница пространства имен в С#

using Foo.Uber;

namespace MyStuff.Foo
{
    class SomeClass{
        void DoStuff(){
            // I want to reference the outer "absolute" Foo.Uber
            // but the compiler thinks I'm refering to MyStuff.Foo.Uber
            var x = Foo.Uber.Bar();
        }
    }
}

Как я могу это решить? Простое использование оператора using внутри моего пространства имен не помогает.

Ответ 2

Фактически вы можете указать полный путь через корневое пространство имен

var x = global::Foo.Uber.Bar();

Обзор пространств имен

Пространство имен имеет следующее Свойства:

  • Они организуют проекты с большим кодом.

  • Они ограничены. оператор.

  • Директива using означает, что вам не нужно указывать имя пространство имен для каждого класса.

  • Пространство имен global является "корневым" пространством имен: global:: systemвсегда будет ссылаться на .NET. Framework namespace Система.

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

Ответ 3

Псевдоним пространства имен в операторе using:

using ThatOuterFoo = Foo.Uber;
...
...
//Some time later...
var x = ThatOuterFoo.Bar();

Ответ 4

Вы можете использовать с помощью директив alias

using Outer = Foo.Uber;

namespace MyStuff.Foo
{
    class SomeClass{
        void DoStuff(){                
            var x = new Outer.Bar(); //outer class
        }
    }
}

Ответ 5

Использование псевдонимаесессеза

using Foo.Uber;
using FooUberBar = Foo.Uber.Bar

namespace MyStuff.Foo
{
    class SomeClass{
        void DoStuff(){
            // I want to reference the outer "absolute" Foo.Uber
            // but the compiler thinks I'm refering to MyStuff.Foo.Uber
            var x = FooUberBar();
        }
    }
}

Ответ 6

Вы можете назначить псевдоним в своей директиве по использованию, как описано в MSDN.