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

C# 使用与更具体的语句冲突的不太具体的语句,c#,ninject,using-statement,C#,Ninject,Using Statement,有人能解释这种行为吗?解决方案是什么 我通过nuget安装了Ninject.MVC3,这会在App_Start文件夹中创建一个名为NinjectWebCommon.cs的文件,名称空间如下: namespace MvcApplication1.App_Start { ... using Ninject; using Ninject.Web.Common; ... } namespace MvcApplication1.Ninject.Modules {

有人能解释这种行为吗?解决方案是什么

我通过nuget安装了Ninject.MVC3,这会在App_Start文件夹中创建一个名为NinjectWebCommon.cs的文件,名称空间如下:

namespace MvcApplication1.App_Start {
    ...
    using Ninject;
    using Ninject.Web.Common;
    ...
}
namespace MvcApplication1.Ninject.Modules {
    using global::Ninject.Modules
    ...
}
现在,我想创建一个Ninject模块,但在识别Ninject名称空间时遇到了一些问题

namespace MvcApplication1.Ninject.Modules {
    using Ninject.Modules
    ...
}
在模块中添加using语句后,NinjectWebCommon.cs就无法再编译。如果我将using放在名称空间之外,它仍然不会编译

但是,如果我将模块的名称空间更改为mvcapapplication1.Foo,则无论哪种方式都可以正常工作


为什么命名此MVCAPApplication1.Ninject.Modules(甚至只是MVCAPApplication1.Ninject)会导致NinjectWebCommon.cs不再找到它的引用?我认为名称空间的目的是防止这种情况发生?

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

using A
而不是

using MvcApplication1.A
因此,编译器将您的示例解释为

namespace MvcApplication1.Ninject.Modules {
    using MvcApplication1.Ninject.Modules
    ...
}
您可以强制编译器仅在全局命名空间中查看,如下所示:

namespace MvcApplication1.App_Start {
    ...
    using Ninject;
    using Ninject.Web.Common;
    ...
}
namespace MvcApplication1.Ninject.Modules {
    using global::Ninject.Modules
    ...
}

我认为这与
Ninject.Modules
的名称与
mvcapapplication1.Ninject.Modules
@Douglas中嵌套命名空间的名称相同有关-显然,但由于我将其限定为mvcapapplication1.Ninject.Modules,我认为这是不冲突的。好的,但这并不能解释为什么当我使用Ninject.Modules添加
时,NinjectWebCommon突然找不到它的引用
到不同(但相关)命名空间中的单独类。当添加隐式添加MVCAPApplication1.Ninject的新命名空间MVCAPApplication1.Ninject.Modules时,使用Ninject变成使用MVCAPApplication1.Ninject也是一样的。