2012-02-22 75 views
2

我有一個名爲Action的類型的名稱解析有問題。雖然項目處於早期狀態,並且所有內容都在同一個項目中聲明,但編譯器總是首選我自己的類。然而,由於需要將項目分成不同的程序集(即ProjectName.Common,ProjectName.Engine等),System.Action和ProjectName.Common.Action之間的命名衝突出現了。不同程序集中系統名稱空間類型和用戶定義類型之間的命名衝突

我發現我可以在任何項目文件的命名空間聲明內顯式導入項目內部命名空間,而系統仍然像IDE最初創建的那樣導入全局範圍。事實上,這種方法很有效,但看起來不太優雅。有沒有更好的方法來解決這個問題?重命名我的Action類是不是一個真正的可接受的解決方案,因爲它是一個相當普遍的域名,並沒有什麼特別喜歡數學,即等

代碼示例:

using System; 
... 

namespace ProjectName.Engine { 

    using ProjectName.Common; 

    class SomeClass { 

     private Action action; 
     ... 

    } 

} 

也許有人知道這些食譜一種命名衝突......

+0

您可以將您的類型重命名爲「Operation」。 – ChaosPandion 2012-02-22 15:20:34

+0

@ChaosPandion:不幸的是,這正是一件讓人無法接受的事情(至少對我而言);-) – 2012-02-22 18:00:39

+0

謝謝大家的回答,他們都非常有幫助。然而,雖然大多數技術問題事先都比較清晰,但我認爲有時候我只是在尋找「最佳美學」解決方案。 – 2012-02-22 18:03:54

回答

3

考慮將Action類放在根ProjectName命名空間中,而不是ProjectName.Common。如果這樣做,那麼在ProjectName命名空間或任何子名稱空間中,Action將引用ProjectName.Action而不是System.Action,並且您不必將using指令添加到所有其他源文件。

+0

我非常喜歡這個想法。記住我遵循這些準則,其中建議只有更深的名稱空間應該取決於高位名稱空間。我只是忘記了這可以或應該適用於同一個項目範圍內的不同程序集。所以對於這種情況,我認爲這是我的實際問題的最佳答案。謝謝! – 2012-02-22 17:58:34

4

您可以使用namespace alias

using Example = ProjectName.Common; 

class SomeClass { 

    private Example.Action action; 
    ... 

} 

或者,一個類型別名爲只有類型:

using Act = ProjectName.Common.Action; 

class SomeClass { 

    private Act action; 
    ... 

} 
1

可以使用using用別名:

using Common = ProjectName.Common; 

然後參考System.Action簡單地Action,並作爲Common.Action你的行動。如果沒有問題,在僅某些部分改變名稱的

using CAction = ProjectName.Common.Action 

而且你可以CActionAction必要時使用。

1

您可以使用,而不必指定完整的命名空間的別名:

using CommonAction = ProjectName.Common.Action; 
1

你可以做你的行動和系統行動區分這

using MyAction = Project.Common.Action

0

嘗試using Action = ProjectName.Common.Action;

您需要在需要引用該類的每個代碼文件中指定該文件,並且如果該代碼文件還需要要使用System.Action代表,那麼您可以在代碼中將其完全限定爲「System.Action」。

當然,您也可以爲System.Action委託人提供別名,但我會發現僅使用完全限定名稱就不那麼容易混淆了。

1

您所做的是處理此問題的適當方法。您也可以使用別名來給出一個臨時名稱,或者給編譯器一個暗示你喜歡哪一個。這節省了您在ProjectName.Common中優先選擇System中的所有類型的麻煩。

using System; 
    using ProjectName.Common 
    ... 

    namespace ProjectName.Engine { 

     using Action = ProjectName.Common.Action; 

     class SomeClass { 

      private Action action; 
      ... 

     } 

    } 
1

無論如何,我會建議你的演員明確。每當你有不明確的引用時,應該這樣做,尤其是在與系統中的名稱相同的情況下。否則,你需要任何必須進入並維護代碼的新程序員混淆。新程序員將看到Action,並假定系統版本沒有明確構建。雖然這比較冗長,但它以清晰的方式表達了代碼及其意圖。這只是我的兩美分。您可以使用其他人建議的別名以相同的方式完成此操作。

相關問題