2011-10-17 197 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的類定義中正確地聲明,而不是像在這裏所做的那樣在單獨的名稱空間中聲明。