using指令在namespace声明里面和外面有什么区别

先说结论,当遇到一个类型的时候,编译器会按以下顺序在命名空间中查找:

  1. 在当前namespace声明里面的using指令导入的命令空间中查找类型;
  2. 在当前命令容间中查找类型;
  3. 在当前namespace声明外面的using指令导入的命令空间中查找类型;

如下示例所示: 假如我们有下面的代码File1.cs

using System;
namespace Outer.Inner
{
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

和另一个代码文件File2.cs

namespace Outer
{
    class Math
    {
    }
}

这里File1.cs中的Math.PI将会报错,因为编译器会先找到Outer命令空间下的Math类型。

如果我们修改一下File1.cs,在命名空间声明内部使用using指令引入System命令空间,修改后的代码如下所示:

namespace Outer.Inner
{
    using System;
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

这样编译器将先在System命令空间下查找Math类型。