类型转换
类型转换是强制转换的超集:每个强制转换都可以通过类型转换显式调用。但是,某些转换需要类型转换。虽然强制转换很普遍且基本上无害,但这些“真正的类型转换”很少见,并且可能很危险。因此,必须使用 as
关键字显式调用类型转换:expr as Type
。
您可以在参考文档中找到所有真正的类型转换和转换语义的完整列表。
类型转换的安全性
真正的类型转换通常围绕原始指针和基本数值类型。尽管它们很危险,但这些类型转换在运行时是不会出错的。如果类型转换触发了一些细微的极端情况,则不会给出任何指示。类型转换只会成功。也就是说,类型转换在类型级别上必须有效,否则它们将在静态时被阻止。例如,7u8 as bool
将无法编译。
也就是说,类型转换不是 unsafe
的,因为它们通常本身不能违反内存安全。例如,将整数转换为原始指针很容易导致可怕的事情。但是,创建指针本身的行为是安全的,因为实际使用原始指针已经被标记为 unsafe
。
关于类型转换的一些注意事项
转换原始切片时的长度
请注意,转换原始切片时不会调整长度;*const [u16] as *const [u8]
创建的切片只包含原始内存的一半。
传递性
类型转换不具有传递性,也就是说,即使 e as U1 as U2
是一个有效的表达式,e as U2
也不一定有效。