繁体   English   中英

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

[英]C# : Why is First namespace redundant?

这有点怪异。

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

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

我们有OurComany.This.That和OurCompany.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”消息。

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

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

我应该说如果我用...

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

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

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

显然,基本问题是范围界定。 据推测,您正在OurCompany下的某个命名空间中处理某些OurCompany ; 我们只是为了争论而说,你在OurCompany.This.That 自动地,直接在OurCompany.This.ThatOurCompany.ThisOurCompany命名空间中找到的任何类型或命名空间都在范围内,不需要使用。 这就是为什么一旦具有OurCompany.Foo命名空间的程序集被涉及就会破坏的原因(默认情况下, OurCompany中的所有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?
                }
            }
        }
    }
}

我承认我不知道这里发生了什么。 但显然,范围并不像“范围内的任何内容,名称空间优先”那样简单。

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

为了解决这个问题,我建议你做以下事情:

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

我知道这很乏味,但我可以看到这是解决你所看到的压倒性(#3000)错误的好办法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM