2011-10-17 199 views
6

我认为以下几点是有意义的,但这不可能,并且会抛出一个错误:The namespace 'foo' already contains a definition for 'bar'命名空间与类名同名

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

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

这样的情况命名空间命名的适当方式是什么?

+3

没有一个实际的例子,建议将不得不做出有根据的猜测,涵盖所有可能的基础,或者没有成为一个好的答案;按照经验法则,名称空间是一个类别,或泛化,而类是特定的实用程序 - 命名应该反映这一点。例如`System.Collections`命名空间和类,比如`System.Collections.CollectionBase`。如果在这个命名空间中需要一个名为`Collections`的类,那么其他的东西是错误的。 – 2011-10-17 12:54:02

+0

这或多或少是一个实际的例子。我想在`bar`类中使用基于`EventArgs`的自定义类型。我应该将自定义类型放在与“bar”相同的名称空间中吗? – Stijn 2011-10-17 12:56:09

回答

4

这真的取决于你想要达到的目的。如果你真的想巴兹的foo.bar命名空间下坐,因为它取决于/紧密联系你吧可以使一个子类吧:

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

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

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

这看起来像我想要实现的。一旦我被允许,我会接受。 – Stijn 2011-10-17 12:58:38

4

您必须为名称空间或类名找到其他名称。没有办法绕过它。

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

1

在相同的命名空间中,不可能具有相同的类名。如果你的命名空间看起来很相似,你可能希望它们在同一个命名空间中。如果情况并非如此,则可能需要在命名空间内重新考虑类的逻辑分类。

+1

同意''。在命名空间中必然会导致更进一步的混乱。 – christofr 2011-10-17 12:54:27

0

可能

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

否则是根本不可能

7

您必须明白,在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的类定义中正确地声明,而不是像在这里所做的那样在单独的名称空间中声明。