C#:为什么第一个名称空间是多余的?
这有点吓人 我在想,一定有某种背景可以解释为什么会发生这种情况 在我们的解决方案中,大约有50个不同的项目。在大多数情况下,库都是从名称空间开始的 我们有我们的公司。这个。那个和我们的公司。Foo。Bar。。。等等 外部库与命名空间之间存在命名空间/类冲突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'
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都在抱怨缺少的类型 为了修复它,我建议您执行以下操作:
我知道这很乏味,但我可以看出这是一个很好的方法来修复你看到的压倒性(#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?
}
}
}
}
}