C#:为什么第一个命名空间是多余的?

Nic*_*las 5 c# namespaces projects-and-solutions qualifiers

这有点怪异.

我在想某个地方必须有一个设置可以解释为什么会这样.

在我们的解决方案中,大约有50个不同的项目 在大多数情况下,库以命名空间OurCompany开头.

我们有OurComany.This.That和OurCompany.Foo.Bar ...等

外部库与命名空间之间存在命名空间/类冲突

OurCompany.Foo.Bar
Run Code Online (Sandbox Code Playgroud)

还有一个合格的班级......

OurCompany.Some.Location.Foo
Run Code Online (Sandbox Code Playgroud)

错误是这样的:

Error   75  The type or namespace name 'MethodName' does not exist in the
namespace 'OurCompany.Foo' (are you missing an assembly reference?)
Run Code Online (Sandbox Code Playgroud)

当我完全限定"OurCompany"命名空间下的任何内容时,甚至Resharper都会给我一个"Qualifier is redundant"消息.

OurCompany.Some.Location.Foo.MethodName();
//OurCompany is redundant
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚到底是做什么的.解决方案非常庞大,因此试图对问题进行逆向工程并不是很好的解决方案.

我应该说如果我用...

Some.Location.Foo.MethodName(); //Leaving out OurCompany
Run Code Online (Sandbox Code Playgroud)

...... Resharper消息消失了.

小智 2

我以为我明白这里发生了什么,但现在我看到一些奇怪的行为,这让我质疑我对 C# 命名空间作用域行为的理解。

显然,基本问题是范围界定。据推测,您正在 ; 下的某个名称空间中处理某些内容OurCompany。为了争论起见,我们只是说,你在OurCompany.This.That。自动地,直接在、和命名空间中找到的任何类型命名空间都在范围内,无需使用。这就是为什么一旦涉及具有命名空间的程序集,事情就会崩溃(默认情况下,所有内容都在范围内,包括命名空间,并且命名空间[显然]优先),也是为什么您会收到冗余命名空间警告(命名空间是在命名空间中定义的,因此它自动在范围内)。OurCompany.This.ThatOurCompany.ThisOurCompanyOurCompany.FooOurCompanyFooSomeOurCompany

但试图重现这种行为时,我遇到了一些奇怪的事情。我创建了一个文件来保存相关世界的其余部分:

namespace OurCompany
{
    namespace Some
    {
        namespace Location
        {
            public class Foo
            {
                public static void MethodName() { }
            }
        }
    }

    namespace Foo
    {
        namespace Bar { }
    }
}
Run Code Online (Sandbox Code Playgroud)

并发现以下内容(我收集的内容与您正在做的类似)不起作用:

using OurCompany.Some.Location;

namespace OurCompany
{
    namespace This
    {
        namespace That
        {
            class BeepBoop
            {
                private void DoSomething()
                {
                    Foo.MethodName();  // No good; Foo is a namespace here.
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...但是这做到了:

namespace OurCompany
{
    namespace This
    {
        namespace That
        {
            using OurCompany.Some.Location;
            class BeepBoop
            {
                private void DoSomething()
                {
                    Foo.MethodName();  // Puh-wha?  This works?
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我坦白承认我不知道这里发生了什么。但显然范围界定并不像“范围内的内容都在范围内,命名空间优先”那么简单。