我正在处理一个我无法真正理解的奇怪错误。将我的脚本精简到最低限度后,就会发生这样的情况。基本上我正在尝试创建一个支持来自 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
你能告诉我我做错了什么和/或幕后发生了什么吗?
谢谢你。
第一个代码块中发生的情况是,PowerShell 将值转换为引用类型的方法之一是调用单参数构造函数,并且 PowerShell 调用构造函数而不是转换函数。
如果您像下面这样更改构造函数,使单个参数是 int,您的代码将可以工作
MyClass([int]$MyNumber) {
$this.MyNumber = $MyNumber
}