PowerShell 自定义类型转换如何让构造函数接收 $null?
数据小许
结论
[CheckBox]$null 不会调用 CheckBox 的构造函数。CheckBox 是引用类型,PowerShell 将 $null 转换为引用类型时仍会得到 $null。因此,后续字符串插值没有 [?] 可以显示。
要创建 NullableBool 为 $null 的实例,请显式调用构造函数:
$box = [CheckBox]::new($null)
Write-Host "Processed: $($box.ToString())"
# Processed: [?]
为什么 [int]$null 的行为不同
CheckBox 的构造函数接收 [Nullable[Bool]],并将参数赋给 $this.NullableBool。传入 $true 或 $false 时,PowerShell 可以据此创建 CheckBox 实例。传入 $null 时,PowerShell 会将它转换为自定义引用类型,结果仍为 $null,因此不会调用单参数构造函数。
[int]$null 使用的是 PowerShell 内置的整数转换规则,会将 $null 转换为 0。这并不是在调用一个接收 $null 的 int 构造函数。PowerShell 语言规范分别规定了数值类型的 $null 转换规则,以及转换为其他引用类型时保留 $null 的规则。PowerShell 语言规范:Conversions
显式构造实例
对于原例,直接调用类构造函数即可:
$box = [CheckBox]::new($null)
$box.ToString()
# [?]
也可以用 Write-Host 输出:
Write-Host "Processed: $($box.ToString())"
如果要用统一入口处理多个输入,可以封装一个函数,并在函数内显式构造实例:
function ConvertTo-CheckBox {
param(
[Nullable[bool]] $Value
)
[CheckBox]::new($Value)
}
$box = ConvertTo-CheckBox $null
Write-Host "Processed: $($box.ToString())"
# Processed: [?]
注意事项
对于这个引用类型,强制转换 $null 得到的仍是 $null。要创建一个内部属性为 $null 的 CheckBox 实例,请使用 [CheckBox]::new($null)。转换行为和构造函数写法也可参见相关问答说明。
备注:内容仅供参考。
