奇怪的合并行为
奇怪的合并行为
最近我在寻找在PowerShell中实现空值合并的方法,然后我遇到了这篇文章:Null coalescing in powershell。
我看到了@Zenexer的评论,觉得很有意思。这是语法:
Clear-Host #预期为one "测试1:" + ("one", "two", 1 -ne $null)[0] #预期为two "测试2:" + ($null, "two", 1 -ne $null)[0]
这个方法运行得很完美。然而,我和同事Walter Puckett对这个语法非常感兴趣,我们进一步研究了一些奇怪的现象。
在我讲述这些奇怪的现象之前,有人能指出一些解释这个语法的文档吗?
## 奇怪的现象: # 显然,数字并不重要 "测试3:" + ($null, "two", 8675309 -ne $null)[0] # 反转比较测试会破坏合并 "测试4:" + ($null, "two", $null -ne 1)[0] # 把测试放在数组中间会导致数组被截断 "测试5:" + ($null, 1 -ne $null, "two").Length # 把测试放在数组中间会导致数组被截断, # 除非你用括号包裹测试 "测试6:" + ($null, (1 -ne $null), "two").Length # 测试中使用的数字会作为数组中该索引位置的值返回 "测试7:" + ($null, $null, 8675309 -ne $null)[0] # 测试中使用的数字会作为数组中该索引位置的值返回, # 除非你用括号包裹测试 "测试8:" + ($null, $null, (8675309 -ne $null))[0] # 用括号包裹测试会破坏合并 "测试9:" + ($null, "two", (1 -ne $null))[0] # 如果所有元素都为null,则默认值将是测试左侧的值 "测试10:" + ($null, $null, 123456789 -ne $null)[0] # 使用对象进行测试 $conn = New-Object System.Data.SqlClient.SqlConnection "测试11:" + ($null, $conn, 1 -ne $null)[0].GetType()
所得教训:
- 测试应该放在数组的最后一个元素
- 测试不应该用括号包裹,因为这会破坏合并
- 默认值必须在测试的左侧,或者作为数组中倒数第二个项硬编码
- 我们测试了数字和简单对象,所以它应该适用于任何类型的对象