Skip to Content

任意类型(Any)

any 装得下任何值,代价是值的类型在编译期未知。

装值与 is 判型

var x: any = 42; print(x); x = "现在是一段文本"; print(x); print(x is string); x = 3.5; print(x is float);
42 现在是一段文本 True True

is 测试值是否为 float 类型,返回 bool。存入 any 的值在编译期丢失具体类型信息,它的方法直接调时会被编译器拦下。收窄之后怎么用收窄出的类型,见模式一页。

Warning

对 any 的成员访问编译期直接拒绝,需要先用 is 收窄再取成员。any 应作为最后手段使用。

any 源参与的转型(o is T、o as T、T(o) 受检转)一律走运行期检查,见类型转换。

is 收窄的实际形状

v is T 对 any 做类型测试,测试通过则可在直条件与 && 链中绑定收窄值:

func Describe(v: any) -> string { if v is int n { return $"整数 {n}"; } if v is string s { return $"字符串 {s}"; } return "别的什么"; } print(Describe(42)); print(Describe("词")); print(Describe(2.5));
整数 42 字符串 词 别的什么

收窄只在直条件与 && 链成立:!(v is T p) 取反形与纯 bool 位(val b = v is T p;)则不被允许。后者用不带绑定的 v is T 即可。

装箱语义

any 里的标量是装箱的:运行时每个值都带着自己的真实类型,is 测试与收窄按它判定,与泛型擦除是同族。没有命中任何分支的值落到兜底串(上面 2.5 既不是 int 也不是 string)。

typeof 与类型同一性

print(typeof(int) == typeof(int), typeof(string) == typeof(int)); val v = 3.5; print(v is float); print(v is int);
True False True False

typeof(T) 产出类型的 Type 值,可比较、可传递。is 的判定按值与目标类型的相容性走:3.5 是 float 不是 int。

值的运行期真实类型可用 Reflect.TypeOf 查询,映射规则见反射。

异质容器

list<any> 存放异质值,遍历时逐元素 is 收窄是最常见的形态:

val bag = new list<any>(); bag.Add(1); bag.Add("字"); bag.Add([1, 2]); for item in bag { if item is int n { print("int", n); } elif item is string s { print("str", s); } else { print("其他"); } }
int 1 str 字 其他

数组字面量 [1, 2] 是 int[],不是 int 也不是 string,落进兜底。

代价与边界

  • 成员访问被编译期拒绝:any 上的 .字段 / .方法() 一律不收,必须先 is 收窄,any 不是万能容器需要避免滥用。
  • 判空收窄的豁免域:any 参与的判空不走可空收窄的状态机,any? 要单独判。
  • 容器类值装进 any 后,is list<int> 这类泛型实例化测试不匹配(运行时不按实例化参数区分),精确类型判断别依赖它。
最后更新于 2026年10月9日