PAYATHON 2026

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)。转换行为和构造函数写法也可参见相关问答说明。

备注:内容仅供参考。