v5 特殊方法 `New` 与静态方法 `New` 冲突
v5 special method `New` conflicts with static methods `New`
PowerShell v5 附带了一项新功能。而不是老式的对象创建
New-Object System.Text.StringBuilder
可以使用新语法
[System.Text.StringBuilder]::new()
虽然新语法引入了一个问题。如果 class 有静态方法
New
那就不能直接调用了。看起来像 PowerShell
认为我们将要调用构造函数,而不是这个静态方法。
我真正的问题案例无法在这里解释,所以我使用现有的 class
举个例子。
此代码适用于 PowerShell v4
[System.Linq.Expressions.Expression]::New([psobject])
它调用静态方法 New
并创建一个表达式。
在 v5 中它失败了
Cannot find an overload for "new" and the argument count: "1".
At line:1 char:5
+ [System.Linq.Expressions.Expression]::New([psobject])
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
问题是我们如何在 PowerShell v5 中调用静态方法 New
?
PowerShell 在 new
是常量字符串标记时调用构造函数,而不是在表达式定义的方法名称时调用构造函数。因此,您可以使用以下解决方法:
$New='New'
[System.Linq.Expressions.Expression]::$New([psobject])
# or
[System.Linq.Expressions.Expression]::('New')([psobject])
# or
[System.Linq.Expressions.Expression]::{New}([psobject])
此外,如果您在 New
后不使用括号,则 PowerShell return PSMethod
对象给您,您可以使用它的 Invoke
方法来调用它.
[System.Linq.Expressions.Expression]::New.Invoke([psobject])
PowerShell v5 附带了一项新功能。而不是老式的对象创建
New-Object System.Text.StringBuilder
可以使用新语法
[System.Text.StringBuilder]::new()
虽然新语法引入了一个问题。如果 class 有静态方法
New
那就不能直接调用了。看起来像 PowerShell
认为我们将要调用构造函数,而不是这个静态方法。
我真正的问题案例无法在这里解释,所以我使用现有的 class 举个例子。
此代码适用于 PowerShell v4
[System.Linq.Expressions.Expression]::New([psobject])
它调用静态方法 New
并创建一个表达式。
在 v5 中它失败了
Cannot find an overload for "new" and the argument count: "1".
At line:1 char:5
+ [System.Linq.Expressions.Expression]::New([psobject])
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
问题是我们如何在 PowerShell v5 中调用静态方法 New
?
PowerShell 在 new
是常量字符串标记时调用构造函数,而不是在表达式定义的方法名称时调用构造函数。因此,您可以使用以下解决方法:
$New='New'
[System.Linq.Expressions.Expression]::$New([psobject])
# or
[System.Linq.Expressions.Expression]::('New')([psobject])
# or
[System.Linq.Expressions.Expression]::{New}([psobject])
此外,如果您在 New
后不使用括号,则 PowerShell return PSMethod
对象给您,您可以使用它的 Invoke
方法来调用它.
[System.Linq.Expressions.Expression]::New.Invoke([psobject])