Конфликт имен между типом пространства имен System и пользовательским типом в другой сборке - PullRequest
2 голосов
/ 22 февраля 2012

У меня проблема с разрешением имен типа Action.Пока проект находился в раннем состоянии и все было объявлено в одном проекте, компилятор всегда предпочитал мой собственный класс.Однако, поскольку возникла необходимость разделить проект на разные сборки (например, ProjectName.Common, ProjectName.Engine и т. Д.), Возник конфликт между именами System.Action и ProjectName.Common.Action.

Я обнаружилчто я могу явно импортировать внутреннее пространство имен проекта в объявлении пространства имен любого файла проекта, в то время как система все еще импортируется в глобальную область, изначально созданную IDE.На самом деле это работает, но выглядит не очень элегантно.Есть ли лучший подход для решения этой проблемы?Переименование моего класса Action не является приемлемым решением, так как это довольно распространенное доменное имя, а не что-то особенное, например, математика и т. Д.

Пример кода:

using System;
...

namespace ProjectName.Engine {

    using ProjectName.Common;

    class SomeClass {

        private Action action;
        ...

    }

}

Возможно, кто-то знаетрецепт для таких конфликтов имен ...

Ответы [ 8 ]

4 голосов
/ 22 февраля 2012

Вы можете использовать псевдоним пространства имен :

using Example = ProjectName.Common;

class SomeClass {

    private Example.Action action;
    ...

}

Или, альтернативно, псевдоним типа только для типа Action:

using Act = ProjectName.Common.Action;

class SomeClass {

    private Act action;
    ...

}
3 голосов
/ 22 февраля 2012

Подумайте о том, чтобы поместить класс Action в корневое пространство имен ProjectName вместо ProjectName.Common.Если вы сделаете это, то внутри пространства имен ProjectName или любого подпространства имен Action будет ссылаться на ProjectName.Action вместо System.Action, и вам не придется добавлять директивы using ко всем другим вашим исходным файлам.

1 голос
/ 22 февраля 2012

Я бы в любом случае предложил сделать ваш бросок явным.В любое время, когда у вас есть неоднозначные ссылки, это должно быть сделано, особенно если вы используете те же имена, что и в System.В противном случае вы просите путаницу у любого нового программиста, который должен войти и поддерживать код.Новый программист увидит действие и примет версию системы, если она явно не создана.Хотя это более многословно, оно четко и ясно выражает код и его намерения.Это всего лишь два моих цента.Вы можете сделать это так же, используя псевдонимы, как предлагали другие.

1 голос
/ 22 февраля 2012

То, что вы сделали, является подходящим способом решения этой проблемы. Вы также можете использовать псевдоним, чтобы дать временное имя или дать компилятору подсказку, какой из них вы предпочитаете. Это избавит вас от необходимости предпочитать все типы в ProjectName.Common системным.

    using System;
    using ProjectName.Common
    ...

    namespace ProjectName.Engine {

        using Action = ProjectName.Common.Action;

        class SomeClass {

            private Action action;
            ...

        }

   }
1 голос
/ 22 февраля 2012

Вы можете различить свое Действие и Системное Действие, выполнив это

using MyAction = Project.Common.Action

1 голос
/ 22 февраля 2012

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

using CommonAction = ProjectName.Common.Action;
1 голос
/ 22 февраля 2012

Вы можете использовать using с псевдонимом:

using Common = ProjectName.Common;

Тогда обратитесь к System.Action как к простому Action, а ваше действие к Common.Action. Если вы можете изменить имя a little только в определенных частях:

using CAction = ProjectName.Common.Action

И вы можете использовать CAction и Action при необходимости.

0 голосов
/ 22 февраля 2012

try using Action = ProjectName.Common.Action;

Вам нужно будет указать это в каждом файле кода, который должен ссылаться на этот класс, и если этот файл кода также должен использовать делегат System.Action, то вы можете простополностью квалифицируйте его в своем коде как "System.Action".

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

...