0

異なるサブ名前空間に 2 つのクラスがあります。

namespace Acme.ByteTools
{
        class ByteTools
        {
        ...
        }
}

namespace Acme.IO
{
        class Reader
        {
        ...
        }
}

3 番目の名前空間から Acme.ByteTools にアクセスしようとしている間、次を使用します。

using Acme.ByteTools;
...
ByteTools.BytesToUint(...);

しかし、Acme.IO から Acme.ByteTools にアクセスしようとすると、コンパイラは別の表記法を必要とします。

using Acme.ByteTools;
...
ByteTools.ByteTools.BytesToUint(...);

なんで?

4

1 に答える 1

2

伝説の Eric Lippert を含む他の人が述べているように...衝突を作成しないでください。衝突が原因でエイリアス ディレクティブを使用するコードが混乱しているのを見たことがありますが、名前空間がクラスからクラスへと名前を変更するのを見るのがどれほどイライラするかを表現することはできません。

混乱はそれ自体を物語っています。次のようなものを見てください:

namespace ConsoleApplication1
{    
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();//A's a namespace
            A.A b = new A.A();//A is a namespace this works!
            global::A.A nuts = new A();//This fails...ugh
            Console.ReadLine();
        }
    }
}

namespace A
{    
    class A
    {
        public void DoWork()
        {
            A a = new A();//A's a class
            A.A b = new A.A();//A is a type (class) A.A makes no sense to the compiler
            global::A.A nuts = new A();//Oh but this works fine
        }

    }
}

したがって、名前空間とクラスが異なることを確認してください。エイリアス ディレクティブを使用using B = A;すると問題が軽減される可能性がありますが、そのディレクティブはファイルごとに変更される可能性があり、その右側にあるものはすべて完全に修飾する必要があります。

于 2013-11-15T04:20:17.940 に答える