为什么在命名空间之外引用的类型需要完全限定?

Mat*_*ton 8 c#

给出以下代码段:

using System;

using Foo = System.Int32;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我删除"系统".从我在"Foo"类型别名的声明中的Int32前面,我得到一个编译器错误.尽管我在文件顶部使用System命名空间,但编译器找不到不合格的"Int32"类型.

这是为什么?

Ree*_*sey 10

这是因为C#规范说它必须是.更具体地说,C#规范中的第9.4.1节说:

写入using-alias-directives的顺序没有意义,using-alias-directive引用的namespace-or-type-name的解析不受using-alias-directive本身或其他使用的影响 - 立即包含编译单元或命名空间体中的指令.换句话说,using-alias-directive的namespace-or-type-name被解析为好像直接包含编译单元或命名空间体没有using-directives.但是,using-alias-directive可能会受到包含在内的编译单元或命名空间体中的extern-alias-directive的影响.

由于顺序无关紧要,因此using System;对using-alias-directive没有影响.重要的具体部分是:" using-alias-directive的namespace-or-type-name被解析为好像直接包含编译单元或命名空间体没有using-directives ".


Chr*_*ain 6

因为使用语句不按任何特定顺序处理.编译器不知道在第二行之前处理第一行.