2013-11-26 2 views
0

У меня есть структура с несколькими пространствами имен, и в каждом пространстве имен у меня есть один статический класс, который является небольшим небольшим пауком в сети этого пространства имен. Как начальник отдела.Конфликт имен между пространством имен и классом

Приведем пример из двух пространств имен, Foo.Bar.Baz и Foo.Bar.Quux.

У меня есть один файл, который выглядит следующим образом:

namespace Foo.Bar.Baz 
{ 
    static class Baz 
    { 
    public static void DoSomething() 
    { 
     Console.Writeline("Doing something..."); 
    } 
    } 
} 

, а затем второй файл:

using Foo.Bar.Baz 
namespace Foo.Bar.Quux 
{ 
    static class Quux 
    { 
    public static void GetToWork() 
    { 
     Baz.DoSomething(); 
    } 
    } 
} 

Теперь, я получаю ошибку во втором файле, когда я пытаюсь скомпилировать потому, что он считает, что Baz - это пространство имен, а не класс. Но так как у меня есть строка using Foo.Bar.Baz, должно быть хорошо использовать любой класс внутри этого пространства имен, не прибегая к префиксному имени имени пространства имен, правильно? Я могу использовать другие вещи из этого пространства имен правильно, но не класс с тем же именем.

Это похоже на то, что компилятор тайно добавляет эту строку в каждый файл: using Foo.Bar.

Кроме того, я не могу просто поставить статический Baz класса внутри Foo.Bar имен с тех пор я получаю ошибки, говоря, что Foo.Bar.Baz не пространство имен (поскольку у меня есть другие вещи в этом пространстве имен, и есть файлы, которые используют это пространство имен). Тогда кажется, что компилятор видит статический класс и решает, что Foo.Bar.Baz является статическим классом, а не пространством имен.

Конечно, я мог бы просто переименовать статические классы что-то вроде менеджера, но тогда я бы еще прописать полный Baz.Manager.SomeMethod и Quux.Manager.SomeMethod в файлы, которые должны получить доступ вещи из обоих пространств имен. Это кажется довольно clumpsy, я бы предпочел, чтобы это было Baz.SomeMethod и Quuz.SomeMethod.

Любые идеи?

+5

Моя идея состоит не в том, чтобы называть классы, подобные пространствам имен – Jehof

+5

См. Http://blogs.msdn.com/b/ericlippert/archive/2010/03/09/do-not-name-a-class-the-same- as-its-namespace-part-one.aspx и последующих записей в серии. –

+0

(Есть повторяющиеся вопросы, но у меня нет времени, чтобы найти их прямо сейчас.) –

ответ

0

Поскольку Baz статический класс, он не может содержать член экземпляра. Таким образом, DoSomething() должен быть объявлен как статический метод.

После того как вы это, вы можете сделать это:

using Foo.Bar.Baz; 

public void GetToWork() 
{ 
    Baz.Baz.DoSomething(); 
} 

или это:

using baz = Foo.Bar.Baz.Baz; 

public void GetToWork() 
{ 
    baz.DoSomething(); 
} 

Однако, я согласен с замечаниями в ваш вопрос, используя то же имя для пространство имен (логический контейнер для набора классов) и его содержащий класс (инкапсулирует данные и поведение) могут приводить к проблемам с читабельностью/ремонтопригодностью.

1

Может быть, это может помочь:

using Baz = Foo.Bar.Baz.Baz; 
Смежные вопросы