【问题标题】:Differentiating class and namespace when class and namespace have the same name当类和命名空间同名时区分类和命名空间
【发布时间】:2020-05-02 04:25:44
【问题描述】:
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'

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

【问题讨论】:

标签: c# .net-core


【解决方案1】:

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

namespace A
{
    class B
    {

    }

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

【讨论】:

    【解决方案2】:

    没有必要声明命名空间,因为类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();
            }
        }
    }
    

    【讨论】:

    • 这在本例中有效,因为它们恰好生活在同一个命名空间中,但个人认为@Sefe 答案可以更广泛地应用。
    • @MichalCiechan 是的,这是一个很好的解决方案。我投了赞成票。此外,我已通过添加替代方式更新了我的回复。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-31
      • 1970-01-01
      • 2010-11-21
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2020-08-21
      • 2012-08-10
      相关资源
      最近更新 更多