与类名相同的命名空间名称

6

我认为以下操作是有道理的,但实际上无法执行并会出现错误:命名空间 'foo' 已经包含了名称为 'bar' 的定义

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

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

在这种情况下,命名空间的合适命名方式是什么?

3
缺少实际示例的情况下,建议只能作出有根据的猜测、考虑所有可能性,或者不足以成为一个好的答案;按照经验法则,命名空间是一种类别或概括,而类是一个具体的实用工具——命名应该反映这一点。例如System.Collections命名空间和类,如System.Collections.CollectionBase。如果在该命名空间中需要一个名为“Collections”的类,则其他地方可能出了问题。 - Grant Thomas
这更或多或少是一个实际的例子。我想在类bar中使用基于EventArgs的自定义类型。我应该将自定义类型放在与bar相同的命名空间中吗? - user247702
5个回答

8
你需要明白,在CLR的上下文中,命名空间并不存在。命名空间仅仅是一种语言特性,只是为了简化代码,让我们不必总是读取完全限定的类名。
在你的例子中,
namespace foo
{
    public class bar { ... }
}



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

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

当它遇到 类baz 时,它会解析类的完整名称为 foo.bar.baz。

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


5

你必须为命名空间或类名找到另一个名称,这是不可避免的。

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


4
这真的取决于你想要实现什么。如果你真的希望baz位于foo.bar命名空间下,因为它与bar有依赖/密切联系,那么你可以将其作为bar的子类:
namespace foo
{
    public class bar 
    {
        public class baz : EventArgs { ... }
    }
}

现在您可以按以下方式创建新实例:

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

这看起来就是我想要实现的。一旦被允许,我会接受它。 - user247702

1

在同一命名空间中,不可能有相同的类名。如果您的命名空间看起来非常相似,您可能希望将它们放在同一个命名空间中。如果不是这种情况,您可能需要重新考虑在命名空间内对类进行逻辑分类。


1
同意,命名空间中的“。”将会在后续的开发中引起混乱。 - christofr

0

可能是

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

否则就根本不可能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接