5

このシナリオで .NET が間違った 'MyType' を検出する可能性はどのように考えられますか?

作業中のプロジェクトに ABCDMyType 型があり、ABMyType 型を持つ DLL を参照していますか? 「ABを使用する」ことはありません。私のコードのどこにでもステートメントがあり、「using ABCD;」があります。コンパイルすると、コンパイラは 'MyType' へのネイキッド リファレンスを 'ABMyType' と見なします。

クラスの名前を変更するか、エイリアスを使用するだけでよいことはわかっていますが、どうすればこれが可能になるのか疑問に思っています。

何か案は?

ありがとう!

4

3 に答える 3

10

AB 名前空間の下にある名前空間で作業していますか? (たとえば、ABX) C# 名前空間の解決 ( ECMA-334 C# 言語仕様: 10.8 10.8 名前空間と型名) の場合:

... 名前空間 N ごとに、namespace-or-typename が発生する名前空間から始まり、各囲み名前空間 (存在する場合) に続き、グローバル名前空間で終わると、エンティティが見つかるまで次の手順が評価されます。 ..

そして、次が続きます:

K がゼロで、名前空間宣言に名前 I をインポートされた名前空間または型に関連付ける extern-alias-directive または using-aliasdirective が含まれている場合、namespace-or-type-name はその名前空間または型を参照します。

これは、名前解決が現在の名前空間から始まり、ルートまでのすべての名前空間を検索し、この階層検索が終了した後にのみ、using句でインポートされた名前空間が検索されることを意味します。

次の例は、「Ns1.Foo」を出力します。

using Ns1.Foo.Foo2;

namespace Ns1.Foo
{
    class Foo
    {
        public void Print()
        {
            System.Console.WriteLine("Ns1.Foo");
        }
    }
}

namespace Ns1.Foo.Foo2
{
    class Foo
    {
        public void Print()
        {
            System.Console.WriteLine("Ns1.Foo.Foo2");
        }
    }
}

namespace Ns1.Foo.Bar
{
    class Bar
    {
        public void Print()
        {
            new Foo().Print();
        }

        static void Main()
        {
            new Bar().Print();
        }
    }
}

編集:名前空間に using 句を追加すると、現在の名前空間の階層検索が行われる前に名前空間が検索されるようになります。例を次のように変更します。

namespace Ns1.Foo.Bar
{
    using Ns1.Foo.Foo2;
    class Bar
    {
        public void Print()
        {
            new Foo().Print();
        }

        static void Main()
        {
            new Bar().Print();
        }
    }
}

Ns1.Foo.Foo2印刷されます。

編集:変更された例

于 2008-11-04T18:20:17.087 に答える
6

あなたのコードは名前空間にありますA.BA.B.C? もしそうなら、それはおそらく問題です。次のような using ディレクティブを使用します。

using TheTypeIWant = A.B.C.D.MyType;

次にTheTypeIWant、コードで参照してください。

using MyType=A.B.C.D.MyType編集: " " オプションを試してみましたが、うまくいきません。上記でも構いません。

于 2008-11-04T17:06:54.177 に答える
0

プロジェクトのプロパティで、「デフォルトの名前空間」が AB に設定されていますか?

于 2008-11-04T16:59:38.760 に答える