繁体   English   中英

名称空间与类名同名

[英]Namespace with same name as a class name

我认为以下内容是有意义的,但它不可能并且会抛出错误: 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,可以使它成为bar的子类:

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

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

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

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

也许

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

否则根本不可能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM