不太具体的使用语句与更具体的语句冲突

时间:2012-05-11 19:39:33

标签: c# ninject using-statement

任何人都可以解释这种行为以及解决方案是什么?

我通过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不再找到它的引用?我认为命名空间的目的是为了防止这种事情发生?

1 个答案:

答案 0 :(得分:2)

在查看全局名称空间之前,在名称空间中使用语句在当前名称空间及其所有祖先的子名称空间中搜索。例如。如果您有一个命名空间MvcApplication1.A,您可以编写

using A

而不是

using MvcApplication1.A

因此,编译器将您的示例解释为

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

您可以强制编译器仅在全局命名空间中查找,如下所示:

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