PowerShell中为何含单个空数组的数组Length属性返回0?
现象底层原因
这个表现是PowerShell数组子表达式运算符@()的明确设计规则导致的,不属于异常bug:
@()的核心逻辑是将括号内所有表达式的输出结果统一封装为数组,但它存在特殊的枚举展开逻辑:运算符会枚举括号内输出的所有可枚举集合的元素,用这些元素来构造最终的数组,而不会直接把集合对象本身作为数组元素,仅当输出内容是单个非集合值时,才会把这个值作为唯一元素封装为数组。
对应测试场景可以逐一匹配规则:
对于
@(@()).Length:
内层@()执行后返回的是1个长度为0的空数组,外层@()会枚举这个空数组的元素,空数组没有任何可枚举的内容,最终外层构造出的就是长度为0的空数组,读取.Length自然返回0。
可以用非空单数组做对照验证:执行@(@(1,2,3)).Length返回结果是3而非1,就是因为外层枚举了内层数组的3个元素来构造新数组,没有生成嵌套的单元素数组。对于多空数组的场景:
比如@(@(), @()),逗号是PowerShell的数组构造运算符,这行代码里括号内的输出是两个独立的空数组对象,外层@()会把这两个独立的数组对象作为非集合元素(因为它们是逗号分隔的独立表达式输出,不会被递归枚举内部),打包为全新的数组,最终数组长度就是元素个数2;三个空数组的场景同理,打包后长度为3,结果符合计数预期。
补充说明:这个设计的初衷是避免无意义的数组嵌套,让管道传参、集合处理的行为更符合日常脚本编写的直觉,只是在单空数组嵌套的极端场景下,会和用户对「@()一定强制套一层数组」的预期产生偏差。
内容的提问来源于stack exchange,提问作者radrow
相关产品推荐
相关产品推荐

