为什么重载 get_/set_ 函数不能按预期工作?

syn*_*-dj 5 class powershell-5.0

显然,Powershell Classes 不支持自定义 getter 和 setter 方法。

当检查从 Powershell v5 类构建的 Powershell 对象实例时,我们发现该类的定义将在对象实例中[type]Property创建隐藏方法[type]get_Property()和方法:[void]set_Property([type])

class myClass {
    [int]$Property
}

[myClass]::new() | Get-Member -Force | Where-Object { $_.Name -like "*Property" }
Run Code Online (Sandbox Code Playgroud)
   TypeName: myClass

Name         MemberType Definition             
----         ---------- ----------             
get_Property Method     int get_Property()     
set_Property Method     void set_Property(int )
Property     Property   int Property {get;set;}
Run Code Online (Sandbox Code Playgroud)

如果 getter/setter 方法对于使用运算符访问属性至关重要,=就像由and运算符.Equals([object])调用的方法一样,我们应该能够重载默认的 getter/setter 方法并看到它简单地工作-eq-ne

class myClass {
    [int]$Property

    hidden [void]set_Property([int]$Property) {
        $this.Property=$Property * 10
    }

    [boolean]Equals([object]$Element) {
        Return $true
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,=接线员绝对不会打电话$leftObject.set_Property($right)

$myObject = [myClass]::new()
$myObject.Property = 3
$myObject.Property
Run Code Online (Sandbox Code Playgroud)
3
Run Code Online (Sandbox Code Playgroud)

与此同时,我们看到这-eq确实在召唤([myClass]$left).Equals($right)

$myObject -eq "anything"
Run Code Online (Sandbox Code Playgroud)
True
Run Code Online (Sandbox Code Playgroud)

那么,看看 Powershell 类实现的机制,如果操作符不使用属性的 getter/setter,为什么=要将它们构建为隐藏方法呢?隐式创建 getter/setter 方法是否有任何技术原因,或者只是一些方便或约定,没有任何类型的运算符绑定?