C#:为什么 First 命名空间是多余的?

C# : Why is First namespace redundant?

这有点吓人。

我想一定有一个设置可以解释为什么会这样。

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

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

外部库与命名空间

之间存在namespace/class冲突
OurCompany.Foo.Bar

还有一个像这样合格的class..

OurCompany.Some.Location.Foo

错误是这样的:

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

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

OurCompany.Some.Location.Foo.MethodName();
//OurCompany is redundant

我不明白到底是什么在做这个。解决方案非常庞大,所以拆开东西尝试对问题进行逆向工程对我来说不是一个很好的解决方案。

我应该声明如果我使用...

Some.Location.Foo.MethodName(); //Leaving out OurCompany

...Resharper 消息消失。

每当我引用的 dll 未构建时,我都会看到此错误。引用可能未构建并且存在一些构建错误。因此,Resharper 和 VS 都在抱怨缺少类型。

为了修复它,我建议您执行以下操作:

  1. 在50个项目的解决方案中尝试找出基础项目。您可以使用项目构建顺序(在解决方案资源管理器中右键单击 sln)
  2. 禁用所有其他项目并点击构建。
  3. 现在验证构建是否成功。如果构建不成功,请修复错误。如果成功,请从步骤 1 开始重复。

我知道这很乏味,但我可以看到这是解决您看到的大量 (#3000) 错误的好方法。

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

显然,基本问题是范围界定。据推测,您正在 OurCompany 下的某个命名空间中处理某些内容;为了便于争论,我们假设您在 OurCompany.This.That。自动地,直接在 OurCompany.This.ThatOurCompany.ThisOurCompany 命名空间中找到的任何类型 或命名空间 都在范围内,不需要使用。这就是为什么一旦涉及到带有 OurCompany.Foo 命名空间的程序集(默认情况下 OurCompany 中的所有内容都在范围内,包括 Foo 命名空间,并且命名空间 [显然] 优先) 以及为什么你会收到冗余命名空间警告(Some 命名空间是在 OurCompany 命名空间中定义的,因此它自动在范围内)。

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

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

    namespace Foo
    {
        namespace Bar { }
    }
}

并发现以下(我收集到的与您所做的类似)不起作用:

using OurCompany.Some.Location;

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

...但是 这样做了:

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

我承认我不知道这里发生了什么。但显然范围界定并不像 "Whatever's in scope is in scope, and namespaces take priority."

那么简单