Frame类库定义了很多类型,各个语言的编译器会从中挑选一部分进行映射,映射的类型是编译器直接支持的,这些类型是primitive type,翻译为中文叫做基元类型。
所以primitive type其实是编译器级别的一种映射,主要还是为了少写代码和提高代码可读性。
dynamic也是基元类型,对应于object类型,那么我做出推断,dynamic特性是由编译器来提供支持的。
隐式转换不仅仅是派生类到基类的转换,也包含编译器提供的常规类型的隐式转换,比如从int32到int64的转换。
C#语言规范,听名字就很professional,应该是所有C#的事无巨细,都能查到标准的地方。
好玩的案例,
byte b = 10; b = b +200; 不能通过编译,第二句b = b+200需要现实转换,因为b+200是int。编译器本身不提供这种类型的隐式转换。
checked和unchecked是溢出检查的关键字,可以作用于编译level,语句块level,语句level。
值类型都是继承自valuetype类型的,仅仅可能是这个类的子类,这就难怪为什么值类型没有type pointer也能在栈里面work了。所有的值类型都是seal的。
作者提到一个有趣的点,将托管代码和native代码进行对比,一个对象是在栈上还是堆上,native代码是由如何声明决定的,而托管代码是写在基因里的。托管代码如何判断基因,是编译器做的事情,它会判断在栈上还是堆上放置object,然后交由CLR来执行。
CLR开放了对象(包括引用对象和值对象)的内存排列借口,在C#中可以为他们赋予property来定义排列类型。