PowerShell op_Explicit 来自仅具有一个属性的对象

问题描述 投票:0回答:1

我正在处理一个我无法真正理解的奇怪错误。将我的脚本精简到最低限度后,就会发生这样的情况。基本上我正在尝试创建一个支持来自 PSCustomObject 的显式对话的类(背景:我希望我的脚本能够消化 JSON 文件,同时确保某些属性的存在) 奇怪的是,显式对话似乎仅在输入对象中有超过 1 个属性时才起作用。

class MyClass {
    [int]$MyNumber

    MyClass($MyNumber) {
        $this.MyNumber = $MyNumber
    }

    hidden static [MyClass] op_Explicit([psobject]$InputObject) {
        return [MyClass]::new($InputObject.Number)
    }
}

$MyObject = [PSCustomObject]@{
    Number = 5
}

[MyClass]$MyObject

最后一行抛出错误:

Cannot convert value "@{Number=5}" to type "MyClass". Error: "Exception setting "MyNumber": "Cannot convert the "@{Number=5}" value of type "System.Management.Automation.PSCustomObject" to type "System.Int32".""

class MyClass2 {
    [int]$MyNumber
    [int]$OtherNumber

    MyClass2($MyNumber, $OtherNumber) {
        $this.MyNumber = $MyNumber
        $this.OtherNumber = $OtherNumber
    }

    hidden static [MyClass2] op_Explicit([psobject]$InputObject) {
        return [MyClass2]::new($InputObject.Number, $InputObject.OtherNumber)
    }
}

$MyObject2 = [PSCustomObject]@{
    Number = 5
    OtherNumber = 1
}

[MyClass2]$MyObject2

这里一切正常

我正在使用 PowerShell Core 7.3.7

你能告诉我我做错了什么和/或幕后发生了什么吗?

谢谢你。

class type-conversion powershell-core
1个回答
0
投票

第一个代码块中发生的情况是,PowerShell 将值转换为引用类型的方法之一是调用单参数构造函数,并且 PowerShell 调用构造函数而不是转换函数。

如果您像下面这样更改构造函数,使单个参数是 int,您的代码将可以工作

MyClass([int]$MyNumber) {
    $this.MyNumber = $MyNumber
}
© www.soinside.com 2019 - 2024. All rights reserved.