Skip to Content

类型

这一部分包括了自定义类型的完整版图,包括了可空类型、结构体、类、元组、属性、枚举等内容。

可空类型(Nullable)T? 表示「有值或没有」。非可空类型编译期保证非 null,判空只在可空类型上有意义。基础写法(??、?.、if val)见运算符与条件分支,本页则重点介绍类型层面的规则。
结构体(Struct)struct 是值语义的复合类型:赋值与传参拷贝整体,改副本不动原件。适合小而自足的数据,如坐标、配置项。
只读数据(Data)data 声明只读数据:声明即实例,深不可变,由编译期完整校验。适合配置表、策划数值、静态图集描述这类「写死在代码里的数据」。
元组(Tuple)元组是定长、异构、不可变的值序列。字面量与类型同形:(3, "甲") 的类型就是 (int, string),分量个数与每个分量的类型都是类型的一部分,(int, string) 与 (int, int)、(int, string, int) 互为不同类型。
类(Class)class 是引用语义的复合类型:赋值与传参共享同一对象,改别名就是改本体。类支持单继承、虚方法、抽象与静态成员,是承载行为与身份的数据的主要声明形态。
属性(Prop)prop 把「读起来像字段、写起来可带逻辑」的成员做成一等公民。自动属性单行即可声明,访问器体在需要时才出现。
枚举(Enum)enum 声明封闭的变体集合。变体可以不带数据,也可以带载荷,配合 match 把互斥情形的结构化分支表达成一等构造。
标志位(Flags)flags 声明可按位组合的常量集合。成员物理上是 int 位,但同声明的组合运算保持 flags 静态面,方法面直接可用。
错误(Error)error 声明错误类型。错误是轻量值:统一用 new 构造,沿 fail 通道流动,被消费之后与普通数据无异,可打印、可比较引用、可读载荷。本页讲错误的声明面,抛出与消费的完整口径见失败。
泛型(Generics)泛型把「类型的形状」与「具体类型」解耦:类型与函数都带类型参数,调用时才定下实例化。约束用 where 子句表达,约束面即能力面。
协议(Protocol)protocol 声明一组成员签名:谁 impl 谁,谁就能以协议类型流动。它是接口契约,也是泛型约束的载体。
混入(Mixin)mixin 是一组可复用成员的声明块,编译期整块克隆进挂载它的类。它解决「多个不相干的类需要同一组方法」的问题,不占用唯一的继承位。
扩展(Extension)extension 给既有类型注入新方法:类型的源码不用动,方法面的补全与调用都像原生成员。标量、用户类型都能扩展。
任意类型(Any)any 装得下任何值,代价是值的类型在编译期未知。
深冻(Frozen)frozen<T> 把一个值变成深不可变形态:构造时深拷贝、与源断开共享,之后任何写路径(索引器、变异方法、字段赋值)都被编译期拦截。配对的 ToMutable() 是唯一的解冻通道。
特性(Attribute)attribute 声明一种元数据标注,@名字 把它贴到声明头上。特性不给声明附加任何行为:它是写给「读代码的人以外的读者」的数据,编辑器面板、序列化标记、热更新边界、宿主注入面都靠它表达。声明与应用在编译期全量校验,读取在运行期走反射。
typeof 与 nameof两个编译期内省表达式:typeof(T) 拿类型的 Type 值,nameof(x) 把名字折叠成字符串常量。
判等与哈希(Equality)== 与 != 的口径全语言二分(ADR-0102):值语义类型比值,引用语义类型比身份。类型用 operator == 重载后按重载走,未重载时按本页口径。
类型别名(Type Alias)typealias 给既有类型起新名字。
最后更新于 2026年10月11日