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

C#:为什么第一个名称空间是多余的?,c#,namespaces,projects-and-solutions,qualifiers,C#,Namespaces,Projects And Solutions,Qualifiers,这有点吓人 我在想,一定有某种背景可以解释为什么会发生这种情况 在我们的解决方案中,大约有50个不同的项目。在大多数情况下,库都是从名称空间开始的 我们有我们的公司。这个。那个和我们的公司。Foo。Bar。。。等等 外部库与命名空间之间存在命名空间/类冲突 OurCompany.Foo.Bar 一个像这样合格的班级 OurCompany.Some.Location.Foo 错误如下所示: Error 75 The type or namespace name 'MethodName'

这有点吓人

我在想,一定有某种背景可以解释为什么会发生这种情况

在我们的解决方案中,大约有50个不同的项目。在大多数情况下,库都是从名称空间开始的

我们有我们的公司。这个。那个和我们的公司。Foo。Bar。。。等等

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

OurCompany.Foo.Bar
一个像这样合格的班级

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”消息。。i、 e

OurCompany.Some.Location.Foo.MethodName();
//OurCompany is redundant
我不知道到底是什么在做这件事。这个解决方案非常庞大,所以把东西拆开,尝试对问题进行反向工程,对我来说不是一个好的解决方案

我应该声明如果我使用

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

…Resharper消息消失。

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

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

  • 在50个项目的解决方案中,尝试找出基本项目。您可以使用项目生成顺序(在解决方案资源管理器中右键单击sln)
  • 禁用所有其他项目并点击build
  • 现在验证构建是否成功。如果生成不成功,请修复错误。如果成功,请重复步骤1
    我知道这很乏味,但我可以看出这是一个很好的方法来修复你看到的压倒性(#3000)错误。

    我本以为我理解这里发生的事情,但现在我看到一些奇怪的行为,这让我对我对C的命名空间范围行为的理解产生了疑问

    显然,基本问题是范围界定。想必,您正在我们公司的
    OurCompany
    下的某个名称空间中工作;为了便于讨论,我们就说你在我们公司。这个。那个。自动地,直接在
    OurCompany.This.That
    OurCompany.This
    OurCompany
    名称空间中找到的任何类型或名称空间都在范围内,无需使用。这就是为什么一个带有
    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.
                    }
                }
            }
        }
    }
    
    ……但这确实:


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

    确实
    SomeStaticClass.SomeStaticMethod()
    工作?是什么代码导致了错误消息?如果你在班上
    我们的公司
    。你不必限定它。只需键入
    SomeStaticClass.SomeStaticMethod();
    甚至
    SomeStaticMethod()
    。这取决于您所在的位置。这就是为什么resharper说它在整个解决方案中都会发生。我有3122个错误。没有任何效果,因为它无法编译。冗余警告不是错误。您有3122个错误。我相信您需要将一些文件引用到您的项目中才能工作。不,对不起,这肯定不是问题。在我之前在我的外部库中添加了名称空间“Foo”,一切都编译得很好。由于与“Foo”名称空间的冲突,编译器在主解决方案中使用“Foo”类的任何东西上都会发疯。但这很疯狂,因为Foo不在同一范围内。我唯一要做的就是第一个名称空间“OurCompany”,在整个解决方案中被认为是多余的。感谢您的帮助。我感谢您仔细阅读我的问题。祝您好运。如果您看到任何问题,请告诉我。如果这确实是您问题的解决方案,请将此标记为答案。请阅读Ben Nesson的答案。他能够证明问题的原因。在看到后,我找到了一个类似的问题,并发现是名称空间解析的顺序导致了我的问题。之后,这是一个简单的解决方法。哇…很好的实验。我在阅读了你的答案后发现了这个链接:好的,所以微妙之处在于,与我最初的概念不同,范围界定基本上只是一堆东西在第一个示例中,当编译器查找
    Foo
    时,它首先检查DoSomething。它在那里没有找到它,所以它向上移动一层到BeepBoop,依此类推,直到它到达
    OurCompany
    命名空间范围。在那里,它找到一个名为
    Foo
    的命名空间。但是在第二个例子是,一旦编译器到达
    That
    命名空间的作用域,它就会找到将Foo类引入作用域的using语句。
    namespace OurCompany
    {
        namespace This
        {
            namespace That
            {
                using OurCompany.Some.Location;
                class BeepBoop
                {
                    private void DoSomething()
                    {
                        Foo.MethodName();  // Puh-wha?  This works?
                    }
                }
            }
        }
    }