2012-05-11 30 views
0

任何人都可以解釋這種行爲和解決方案是什麼?不太具體的使用語句與更具體的語句衝突

我通過安裝的NuGet Ninject.MVC3,這會在App_Start文件夾中一個名爲與命名空間這樣NinjectWebCommon.cs:

namespace MvcApplication1.App_Start { 
    ... 
    using Ninject; 
    using Ninject.Web.Common; 
    ... 
} 

現在,我想創建一個NinjectModule和時遇到一些問題Ninject名字空間被識別。

namespace MvcApplication1.Ninject.Modules { 
    using Ninject.Modules 
    ... 
} 

只要我在模塊中添加using語句,NinjectWebCommon.cs就不能再編譯。如果我把這個使用放在命名空間之外,它仍然不會編譯。

但是,如果我更改命名空間爲我的模塊MvcApplication1.Foo,然後正常工作兩種方式。

爲什麼要命名這個MvcApplication1.Ninject.Modules(或者甚至只是MvcApplication1.Ninject)會導致NinjectWebCommon.cs不再發現它的引用?我認爲命名空間的目的是爲了防止這種事情?

+0

我會假設它有事情做與'Ninject.Modules'被等同於'MvcApplication1.Ninject.Modules'嵌套命名空間的名稱的名稱。 – Douglas

+0

@Douglas - 很明顯,但由於我將它定位爲MvcApplication1.Ninject.Modules,我認爲這會被認爲是非衝突的。 –

回答

2

使用望着全局命名空間之前,在當前的命名空間及其所有祖先的孩子命名空間的命名空間內搜索語句。例如。如果你有一個命名空間MvcApplication1.A你可以寫

using A 

而不是

using MvcApplication1.A 

正因爲如此,你的例子是由編譯器解釋爲

namespace MvcApplication1.Ninject.Modules { 
    using MvcApplication1.Ninject.Modules 
    ... 
} 

您可以強制該編譯器將只在全局命名空間是這樣的:

namespace MvcApplication1.Ninject.Modules { 
    using global::Ninject.Modules 
    ... 
} 
+0

好,但這並不能解釋爲什麼NinjectWebCommon突然找不到它的引用,當我添加一個'使用Ninject.Modules;'以不同(但相關的)命名空間的獨立的類。 –

+0

這是使用Ninject同樣成爲使用MvcApplication1.Ninject當你添加新的命名空間MvcApplication1.Ninject.Modules含蓄地增加MvcApplication1.Ninject了。 –