C # Project & Namespaces Question - PullRequest
       6

C # Project & Namespaces Question

1 голос
/ 16 августа 2011

Я создаю небольшую библиотеку Math для себя, содержащуюся в одном проекте, и сталкиваюсь с некоторыми проблемами с пространствами имен. У меня есть проект MyMathLib и пространство имен верхнего уровня:

namespace MyMathLib
{ ... }

и в отдельном файле ...

namespace MyMathLib.Addition
{ ... }

и ...

namespace MyMathLib.Subtraction
{ ... }

В пространстве имен MyMathLib.Subtraction у меня есть метод, который должен использовать статический метод SomeClass.Work(), определенный в MyMathLib.Addition, поэтому я включил using MyMathLib.Addition в начале файла Subtraction. Но когда я пытаюсь использовать метод, мне бы хотелось, чтобы я сначала квалифицировал его как Addition.SomeClass.Work(), и я хочу иметь возможность просто набрать SomeClass.Work(). Что я делаю не так?

Спасибо!

EDIT

Спасибо за предложения! В каждом файле я фактически назвал класс в честь пространства имен (то есть в пространстве имен MyMathLib.Addition это статический класс Addition, а в MyMathLib.Subtraction есть статический класс Subtraction). Видимо, именно это и вызвало проблему (оглядываясь назад, я должен был указать это вместо использования SomeClass). Если я изменю пространство имен на MyMathLib.MyAddition, сохраняя статический класс как Addition, using MyMathLib.MyAddition будет работать так, как я хочу; то есть теперь я могу просто ввести Addition.Work() в моем статическом Subtraction классе. Я видел классы, названные так же, как они содержат пространство имен, может кто-нибудь объяснить, почему это вызывает проблему? Разве компилятор не сможет определить, хочу ли я использовать пространство имен или класс из контекста кода?

Ответы [ 3 ]

3 голосов
/ 16 августа 2011

Я предполагаю, что у вас либо есть два класса с именем SomeClass, которые оба находятся в пространствах имен, на которые вы ссылаетесь, либо у вас есть переменная или свойство с именем SomeClass.В любой из этих ситуаций компилятор не сможет узнать, что вы пытаетесь вызвать статический метод MyMathLib.Addition.SomeClass.Work(), но конкретное решение, предлагаемое компилятором, делает его более вероятным первым.

Обновление

Видя ваши изменения, это имеет смысл.Если бы вы использовали их в пространстве имен за пределами MyMathLib, то вы все равно смогли бы избежать этого конфликта пространства имен.Однако, поскольку вы находитесь внутри пространства имен MyMathLib.Subtraction, компилятор будет неявно рассматривать любую часть пространства имен «над» вами, чтобы иметь приоритет над именами классов.В этом случае, когда вы говорите «Добавление», компилятор ищет следующие элементы для разрешения имени:

  1. Класс, явно указанный в директиве using ... = ....
  2. MyMathLib.Subtraction.Addition пространство имен.
  3. MyMathLib.Addition пространство имен.
  4. Addition пространство имен.
  5. Любые классы в пространствах имен, определенные с помощью операторов using.

В этом случае вы попадаете на № 3 перед № 4, поэтому вы можете обойти его, переименовав класс или пространство имен, или воспользовавшись предложением Яхии (# 1):

using Addition = MyMathLib.Addition.Addition;

Обновление 2

После просмотра статьи, на которую вы ссылаетесь, звучит так, будто явное выражение using все равно не будет работать.Я думаю, что пункт № 1 на самом деле оценивается ниже пункта № 4.Облом.Вы можете использовать псевдоним, чтобы локально присвоить классу другое имя:

using Add = MyMathLib.Addition.Addition;

...

var add = new Add();

Но, тем не менее, лучшим решением по-прежнему будет просто избежать коллизии пространства имен, полностью изменив свое пространство имен или имя класса..

1 голос
/ 16 августа 2011

попробуйте добавить дополнительную линию в ваш источник вычитания

using SomeClass = Addition.SomeClass;

http://msdn.microsoft.com/en-us/library/dfb3cx8s.aspx
http://www.blackwasp.co.uk/NamespaceAliasQualifier.aspx

0 голосов
/ 16 августа 2011

Звучит так, как будто вы находитесь в пространстве имен Subtraction ... добавьте это в начало, внутри объявления пространства имен:

using Addition;

Это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...