类型转换

类型转换是强制转换的超集:每个强制转换都可以通过类型转换显式调用。但是,某些转换需要类型转换。虽然强制转换很普遍且基本上无害,但这些“真正的类型转换”很少见,并且可能很危险。因此,必须使用 as 关键字显式调用类型转换:expr as Type

您可以在参考文档中找到所有真正的类型转换转换语义的完整列表。

类型转换的安全性

真正的类型转换通常围绕原始指针和基本数值类型。尽管它们很危险,但这些类型转换在运行时是不会出错的。如果类型转换触发了一些细微的极端情况,则不会给出任何指示。类型转换只会成功。也就是说,类型转换在类型级别上必须有效,否则它们将在静态时被阻止。例如,7u8 as bool 将无法编译。

也就是说,类型转换不是 unsafe 的,因为它们通常本身不能违反内存安全。例如,将整数转换为原始指针很容易导致可怕的事情。但是,创建指针本身的行为是安全的,因为实际使用原始指针已经被标记为 unsafe

关于类型转换的一些注意事项

转换原始切片时的长度

请注意,转换原始切片时不会调整长度;*const [u16] as *const [u8] 创建的切片只包含原始内存的一半。

传递性

类型转换不具有传递性,也就是说,即使 e as U1 as U2 是一个有效的表达式,e as U2 也不一定有效。