与类名同名的命名空间

本文关键字:命名空间 | 更新日期: 2023-09-27 18:11:32

我认为这样做是有意义的,但这是不可能的,并且会抛出一个错误:The namespace 'foo' already contains a definition for 'bar'

namespace foo
{
    public class bar { ... }
}
namespace foo.bar
{
    public class baz : EventArgs { ... }
}

对于这样的情况,名称空间命名的合适方式是什么?

与类名同名的命名空间

您必须明白,在CLR的上下文中,没有命名空间这样的东西。名称空间纯粹是一种语言特性,它的存在只是为了简化代码,这样我们就不必总是读取完全限定的类名。

在您的示例中,

namespace foo
{
    public class bar { ... }
}

namespace foo.bar
{
    public class baz : EventArgs { ... }
}

当编译这个源代码时,IL甚至不知道有两个名称空间-foo和foo.bar。相反,它只知道类定义。在这种情况下,当它遇到类栏时,它知道您有一个名为foo.bar 的类

当遇到baz类时,会将该类的全名解析为foo.bar.baz

但如果是这样的话,baz应该在bar的类定义中正确地声明,而不是像您在这里所做的那样在单独的命名空间中声明。

您必须为命名空间或类名找到另一个名称。没有办法绕过它。

找到合适的命名很困难,但可以做到。

这实际上取决于您想要实现的目标。如果你真的想让baz位于foo.bar命名空间下,因为它是依赖的/紧密链接的,你可以让它成为bar的子类:

namespace foo
{
    public class bar 
    {
        public class baz : EventArgs { ... }
    }
}

您现在可以创建一个新实例为:

var test = new foo.bar.baz();

在同一个命名空间中,不可能有相同的类名。如果您的名称空间看起来非常相似,那么您可能希望它们位于同一名称空间中。如果不是这样,您可能需要重新考虑命名空间中类的逻辑分类。

可能是

namespace foo_bar
{
    public class baz : EventArgs { ... }
}

否则,根本不可能