为什么C#为`using`定义了两种不同的用途?

Dav*_*ter 23 c# using language-specifications

更多的问题出于好奇而不是任何事情,但为什么C#为关键字定义了两个不同的"目的" using?一方面,它是一个指令......

用于为命名空间创建别名或导入在其他命名空间中定义的类型.

另一方面,这是一个......

定义一个范围,在该范围之外将放置一个或多个对象.

对我而言,对于相同的关键字似乎有不同的用途,但也许我错过了一些东西.这个关键字有两个不同的用途吗?或者,这两个目的,在编译器的腹部深处,真的是一样的东西?

Rei*_*ica 20

我问埃里克利珀在他的博客在几年前同样的问题在这里(见第一注释).

他的回答是:

这是一个棘手的语言设计点; 当一个关键字用于表示两个完全不同的概念时,它可能会令人困惑.但是,每个概念引入一个新关键字会让语言感觉有点臃肿.我个人会为指令表单选择"导入"或一些这样的语法,以确保它不会与语句形式混淆,但我理解它是一个判断调用.

我们正在为C#4.0设计一个被削减的功能,这是另一种形式的"部分"类; 基本上,一种在机器生成的和用户生成的部分类的一半之间共享属性元数据的方法.我继续使用关键字"partial"作为特征,因为我们在C#中对于"部分"有三个微妙的不同含义,我觉得这两个太多了.(我主张添加另一个条件关键字"现有".不幸的是,由于缺少时间,因此该功能被削减了,这一点最终没有实际意义.) - Eric

对于那些不知道Eric是谁的人,他是C#编译团队的开发人员.


Tom*_*cek 19

我无法看到这两种用法在编译器中是如何相同的.

我认为双重使用的原因仅仅在于关键字非常适合这两个目的,并且没有歧义的危险(一个是指令,另一个是语句,因此它们出现在完全不同的上下文中).我认为这很好 - 一种语言应该有少量的关键字,它们的用途应该很容易理解 - 这两种用法都是如此using.

正如Linkgorn在评论中提到的那样,同样情况的另一个例子where也存在于两个地方(泛型约束和LINQ查询语法).