当类和命名空间同名时区分类和命名空间

Spa*_*row 1 c# .net-core

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            A.B var = new A.B();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 msvc 2019 和 .net core 3.1 编译,此代码示例给出以下错误:

Error   CS0426  The type name 'B' does not exist in the type 'A'
Run Code Online (Sandbox Code Playgroud)

我知道最好不要为类和命名空间提供相同的名称。但是有没有办法解决这种碰撞?

Ste*_*pUp 6

不需要声明命名空间,因为 classB已经用与 class 相同的命名空间声明了A。因此,只需删除A,Visual Studio 就会弄清楚它是可取的:

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            B var = new B();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

另一种解决方案是:

using _a = A;

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            _a.B var = new _a.B();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Sef*_*efe 5

您应该避免将类和命名空间命名为相同的情况。如果您不能或使用第三方代码,您始终可以使用global::关键字来引用命名空间:

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            global::A.B var = new global::A.B();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)