当类和名称空间具有相同名称时区分类和名称空间

时间:2020-01-15 11:48:11

标签: c# .net-core

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            A.B var = new A.B();
        }
    }
}

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

Error   CS0426  The type name 'B' does not exist in the type 'A'

我知道最好不要为类和名称空间使用相同的名称。 但是有什么方法可以解决这种冲突吗?

3 个答案:

答案 0 :(得分:6)

由于类B已被声明为与类A相同的名称空间,因此无需声明名称空间。因此,只需删除A,Visual Studio就会找出所需的内容:

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            B var = new B();
        }
    }
}

更新:

另一种解决方案是:

using _a = A;

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            _a.B var = new _a.B();
        }
    }
}

答案 1 :(得分:5)

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

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            global::A.B var = new global::A.B();
        }
    }
}

答案 2 :(得分:2)

我认为您误解了名称空间的工作方式。您不需要在类A中完全限定B。您可以简单地引用类B,因为两个类都在同一个命名空间中。像这样:

namespace A
{
    class B
    {

    }

    class A
    {
        public void f()
        {
            B var = new B();
        }
    }
}