2012-02-22 9 views
2

「アクション」と呼ばれる型の名前解決に関する問題があります。プロジェクトが初期の状態で、同じプロジェクトですべてが宣言されている間、コンパイラは常に自分のクラスを優先していました。しかし、プロジェクトを別のアセンブリ(ProjectName.Common、ProjectName.Engineなど)に分ける必要が生じたため、System.ActionとProjectName.Common.Actionの間の名前の競合が発生しました。異なるアセンブリ内のシステム名前空間型とユーザー定義型の間の名前の競合

システムがまだIDEによって最初に作成されたグローバルスコープでインポートされている間に、プロジェクト内部名前空間をプロジェクトファイルの名前空間宣言の中に明示的にインポートできることが分かりました。実際にはこれは動作しますが、非常にエレガントに見えません。この問題を解決するためのより良いアプローチはありますか?

using System; 
... 

namespace ProjectName.Engine { 

    using ProjectName.Common; 

    class SomeClass { 

     private Action action; 
     ... 

    } 

} 

はたぶん誰かがそれらのためのレシピを知っている:それは非常に一般的なドメイン名ではなく、すなわち数学など

コード例のような特別なものであるので、私のActionクラスの名前を変更すると、実際に受け入れ可能な解決策ではありませんため

using Example = ProjectName.Common; 

class SomeClass { 

    private Example.Action action; 
    ... 

} 

または代わりに、タイプの別名:あなたはnamespace aliasを使用することができます

+0

タイプを「操作」に変更することができます。 – ChaosPandion

+0

@ChaosPandion:残念ながら、それはまったく受け入れられないものでした(少なくとも私のために);-) –

+0

あなたの答えはありがとうございました。それらのすべては全く同じように役立ちます。しかし、技術的な問題の多くは事前に私には比較的明確であったが、私は時には「最高の審美的」な解決策を探しているだけであると思う。 –

答えて

3

ActionクラスをProjectName.Commonの代わりにProjectNameという名前空間に配置することを検討してください。その場合、ProjectName名前空間または任意のサブネームスペース内でActionSystem.Actionの代わりにProjectName.Actionを参照し、他のすべてのソースファイルにusingディレクティブを追加する必要はありません。

+0

私はその考えが本当に好きです。より深い名前空間だけが上位の名前空間に依存することを推奨するこれらのガイドラインを思い出します。私は、これが同じプロジェクトスコープ内の異なるアセンブリにも適用できることを忘れていました。その場合、私はそれが私の実際の問題に対する最良の答えだと思います。ありがとうございました! –

4

名前の競合の種類...唯一タイプ:Common.Actionとその後単にActionとしてSystem.Actionを参照してください

using Common = ProjectName.Common; 

、そしてあなたの行動:

using Act = ProjectName.Common.Action; 

class SomeClass { 

    private Act action; 
    ... 

} 
1

あなたが別名でusingを使用することができます。あなたが唯一の特定の部分に名前を少しを変更すると大丈夫だ場合:

using CAction = ProjectName.Common.Action 

をそして、あなたはCActionActionは、必要に応じて使用することができます。

1

あなたが代わりに完全な名前空間を指定するのでエイリアスを使用することができます。

using CommonAction = ProjectName.Common.Action; 
1

あなたはこの

using MyAction = Project.Common.Action

0

を行うことで、あなたのアクションとシステムアクションを区別することができますusing Action = ProjectName.Common.Action;

を試してみてください

このクラスを参照する必要がある各コードファイルでこれを指定する必要があります。また、そのコードファイルにもSystem.Actionデリゲートを使用するには、コード内で「System.Action」と完全修飾するだけです。

もちろん、System.Action代理人にエイリアスを付けることはできますが、完全修飾名を使用するのは紛らわしいことではありません。

1

この問題を処理するには適切な方法があります。エイリアスを使用して一時的な名前を付けることもできますし、どちらを好むかについてのヒントをコンパイラに与えることもできます。これにより、システム上のProjectName.Commonですべてのタイプを優先させる手間が省けます。

using System; 
    using ProjectName.Common 
    ... 

    namespace ProjectName.Engine { 

     using Action = ProjectName.Common.Action; 

     class SomeClass { 

      private Action action; 
      ... 

     } 

    } 
1

とにかくキャストを明示的にすることをお勧めします。あいまいな参照がある場合は、これを行う必要があります。特に、Systemと同じ名前を使用する場合は注意してください。それ以外の場合は、コードを入手して維持しなければならない新しいプログラマーから混乱が生じることを求めています。新しいプログラマは、明示的に構築されていない場合、Actionを見てSystemバージョンを想定します。これはより冗長ですが、明確な方法でコードとその意図を表現します。それはちょうど私の2セントです。エイリアスを使用して同様の方法でこれを実現できます。

関連する問題