c#语言中"类型"一词的最佳定义是什么?

sia*_*mak 2 c# types programming-languages definition

这可能是一个非常简单的问题,但我对类型定义感到困惑.

当你想提供一个术语类型的定义,如Int, String或...时,我会想到
这个词 Template,但它的"Class"定义如此接近,现在我想知道什么是术语类型的定义.

Is it the same as class definition!?Type == class!?

如果是这样,我们知道还有其他的(参考)在C#中不属于的类型 Class ,如InterfaceDelegate.

是否可以互换使用Type和Class?
你能否给我一个关于Type的全面定义.
提前致谢.

Eri*_*ert 14

正如其他人所说,C#规范没有正式定义"类型".C#规范既不是语言语义的正式数学描述,也不是初学程序员的教程; 在开始阅读规范之前,你应该知道"类型"和"值"等词是什么意思.

"类型"有许多可能的定义,具有不同的精度.例如,ECMAScript规范在某种程度上非正式地将类型定义为"一组值",但由于ECMAScript只有九种可能的类型,因此它不需要具有严格的,有根据的定义.

另一个答案是,类型由一组值,一组用于操作这些值的规则和一个名称组成.这是一种非常常见的类型工作定义,但当您尝试更正式地考虑它时,它会遇到问题.匿名类型的名称是什么?是double*[][]名称类型"指针翻番的锯齿形二维数组"的?这种类型甚至有名字吗?是List<int>List<System.Int32>两个不同的名称相同的类型?是否有任何值组成一个类型?类型本身是否值?什么是类型?等等.这是一个很好的工作定义,但它并没有受到严格审查.

作为编译器编写者,我在C#中考虑类型的方式如下:类型是可以应用于表达式分类.根据C#的规则,如果存在证明表达式如何在法律上被归类为该类型的证据,则表达式被分类为特定类型.

例如,假设我们正在尝试计算表达式"1 + 2.3"的类型.我们首先计算表达式"1"的类型.C#的规则给了我们; 该表单的表达式始终归类为int.我们计算出表达式"2.3"的类型.同样,C#的规则告诉我们这个表单的表达式被归类为"double".整个表达的类型是什么?C#的规则告诉我们"int"和"double"的总和被归类为"double".所以这个表达式的类型是"double".

这就是编译器在执行类型分析时所做的事情:它构造了特定表达式可以合法地以特定方式分类的证据,或者,如果程序是错误的,它会告诉您为什么它无法构造证明.

但是,在这个层面上,所有类型都只是一种分类.您可以对任何域执行相同的操作.你说在正整数域中,某些数字被归类为"奇数",某些数字被归类为"偶数".某些数字被归类为"素数"和"复合数".如果你想对一个数字进行分类,比如"123",那么你可以写一个证明"123"被分类为"奇数"和"复合"的证据.

你可以编制你想要的任何分类,你知道你刚刚做了什么吗?你刚刚做了一个类型.您可以将数字分类为"两个素数之和"和"不是两个素数之和","大于四"和"不大于四".然后你可以将它们组合成类型,例如"偶数大于4的整数而不是两个奇数素数的总和".很容易确定任何特定的整数是否是此类型的成员; 到目前为止,我们所尝试的所有整数都被确定为属于该类型的成员.目前还不知道该类型是否有任何成员; 只是因为你能想出一个类型并不意味着你知道类型的大小!

类型系统可以允许任何可能的分类方案.我们可以编写C#,这样"奇数"和"偶数","素数"和"复合"都是"int"的子类型.我们可以写C#,使任何你可以写下整数的属性是int型的亚型!我们不这样做,因为这种类型的系统给编译器带来了巨大的负担; 使用这种类型系统的编译器非常复杂,非常慢,并且可能遇到必须解决不可能出现的问题的情况.CLR和C#的设计者构建了我们拥有的类型系统,使得编译器(通常)可以非常快速地将表达式分类为类型.