【问题标题】:namespaces and using scope resolution [duplicate]命名空间和使用范围解析
【发布时间】:2017-11-15 02:10:48
【问题描述】:

我在 C# .NET Core 2.0 中遇到了一些我觉得奇怪的东西,我想知道这里发生了什么。

我有一个名为 FooBar.cs 的文件,它看起来像这样

namespace Foo
{
    public class FooClass
    {

    }

    namespace Bar
    {
        enum BarEnums
        {
             Bar1
            ,Bar2
            ,Bar3
        }
    }
}

我有一个看起来像这样的简单程序

using System;

using Foo;

namespace Using
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            FooClass fooClass = new FooClass();

            Console.WriteLine(Bar.BarEnums.Bar1);
        }
    }
}

这给了我以下错误:

Program.cs(16,22): error CS0103: The name 'Bar' does not exist in the current context

我很困惑为什么 using 语句在名称空间中公开了类,但它没有公开也在同一级别找到的名称空间?如果我输入using Foo.Bar,它仍然会给出同样的错误。所以 using 语句可以看到命名空间,但它不能帮助它找到下面的引用。

现在,如果我输入Foo.Bar.BarEnums.Bar1,它会工作得很好。但是为什么我不必按照与枚举引用相同的命名法输入Foo.FooClass?这只是从命名空间中访问枚举与类之间的区别吗?

【问题讨论】:

    标签: c# .net-core


    【解决方案1】:

    发生这种情况是因为using Foo 仅导入给定命名空间中包含的类型,但并未专门导入嵌套命名空间。这就是为什么当您引用 enum 时,您必须使用完整的命名空间引用。

    这是一个 C# 语言规范。

    这是来自 C# 团队的一个人的解释:

    在 C# 中,当您指定“using”子句时,例如

    使用 System.Text;

    编译器仅将 System.Text 中的类型导入全局 命名空间——它对内部的任何命名空间都不做同样的事情 系统.文本。所以,虽然使用允许我写:

    StringBuilder s = new StringBuilder();

    它不允许我写:

    RegularExpressions.Regex r = new RegularExpressions.Regex();

    为什么?

    嗯,早期版本的 C# 编译器有这种行为,但我们 发现它有几个问题:

    首先,它使代码更难遵循。在上面的例子中, RegularExpressions.Regex() 可以是全局名称,也可以是基于 我的任何使用条款。必须查看代码的顶部才能 弄清楚名字是什么是我们想要避免的。

    第二个问题与命名空间名称之间的冲突有关, 这种行为更频繁地发生。如果有 另一个命名空间,里面有一个 RegularExpressions 命名空间, 用户将无法对两者都使用“使用”语句——甚至 如果他们实际上并不关心该命名空间。

    因此我们决定改变这种行为。

    https://blogs.msdn.microsoft.com/csharpfaq/2004/03/07/why-dont-namespace-using-directives-import-nested-namespaces/

    这里是 C# 规范:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/namespaces

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多