Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免表面上自动引用;“家长”;名称空间?_C#_Visual Studio_Namespaces - Fatal编程技术网

C# 如何避免表面上自动引用;“家长”;名称空间?

C# 如何避免表面上自动引用;“家长”;名称空间?,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

我相信我对名称空间层次结构有一个根本性的误解,导致了与此问题几乎相反的问题:

我有两个.cs文件,其中包含以下内容:

文件1

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));