C# 如何避免表面上自动引用;“家长”;名称空间?
我相信我对名称空间层次结构有一个根本性的误解,导致了与此问题几乎相反的问题: 我有两个.cs文件,其中包含以下内容: 文件1C# 如何避免表面上自动引用;“家长”;名称空间?,c#,visual-studio,namespaces,C#,Visual Studio,Namespaces,我相信我对名称空间层次结构有一个根本性的误解,导致了与此问题几乎相反的问题: 我有两个.cs文件,其中包含以下内容: 文件1 namespace Parent.Math { public class Foo { } } 文件2 using System; namespace Parent.Child { public class Bar { public Bar() { Console.WriteLine(Math
namespace Parent.Math
{
public class Foo { }
}
文件2
using System;
namespace Parent.Child
{
public class Bar
{
public Bar()
{
Console.WriteLine(Math.Sqrt(4));
}
}
}
文件2显示错误:CS0234-命名空间“Parent.Math”中不存在类型或命名空间名称“Sqrt”
为什么编译器假定Math
引用同级命名空间,而不是显式引用的System
命名空间的成员?该行为就像自动引用父命名空间一样。这是正确的吗?我至少会预料到一个模棱两可的错误
谢谢。当您在命名空间中时,编译器总是假定您也在父命名空间中 因此,当在
Parent.Child
中编写Math
时,编译器在Child
中搜索,然后在Parent
中搜索,并找到Math
作为命名空间,但没有Sqrt
类型,因此出现错误
编译器会这样搜索,并沿着名称空间链向上搜索
如果没有名称空间,则处于全局
你可以简单地写:
Console.WriteLine(System.Math.Sqrt(4));
或在出现问题时:
Console.WriteLine(global::System.Math.Sqrt(4));
你也可以写:
using SystemMath = System.Math;
Console.WriteLine(SystemMath.Sqrt(4));
从C#6开始:
我记得在某个地方读到过这样一句话:搜索名称时,它总是从当前名称空间开始。“行为就像自动引用父名称空间一样。这是否正确?”是。或者使用系统输入名称空间内的代码>。如果您想知道血腥的细节,14.5.3在ecma规范中使用名称空间指令这是“不好的做法”的原因是什么?
部分原因是它使代码更难审查(与明确说明系统相比)。但老实说,由于冲突,无论怎样都很难进行审查。@GeorgeKerwood我对ecma有点乐观,决议实际上是由几个主题组成的。关于在编译单元中是应该使用包含使用还是全局使用,有两个学派。两者都有好处,只要你是一贯的,我就不会考虑任何不良的做法。谢谢。我知道解决方案选项(别名和完全限定名)。我真的想了解为什么父名称空间被提升到显式引用之上,或者至少为什么没有抛出歧义错误。我从评论中得到了我的答案,你在这里的答案可能会对某些人有用。太好了,这是现在的答案,谢谢。为了完整起见,是否可以在名称空间中包含using语句?根据@MichaelRandall的评论。
using static System.Math;
Console.WriteLine(Sqrt(4));