>我有一个函数,它正在运行一些代码,并在成功的情况下返回$True,否则$False。
作为函数代码的一部分,我使用此强制要求将某些 cmdlet 的结果强制转换为 [void]
function New-SampleFunction
{
[void]::('2');
return $true
}
[bool]$myReturnValuen = New-SampleFunction
# This results in exception
The above will result in a Cannot convert value "System.Object[]" to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
当然,如果我让 PowerShell 推断函数返回值中的类型,这将起作用,但有趣的是我检查变量的内容
function New-SampleFunction
{
[void]::('2')
return $true
}
$myReturnValuen = New-SampleFunction
$returnValue.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
但是如果我运行$returnValue来获取会员,我得到的就是这个
$returnValue | Get-Member
TypeName: System.Boolean
问题很容易解决,将上面的代码更改为
function New-SampleFunction
{
[void]('2')
return $true
}
$myReturnValuen = New-SampleFunction
代码中的问题已解决,但我现在很好奇为什么会这样,我当然错过了两个 void 和 [void]::(blahblah( 之间的区别,并且找不到任何明显的答案。
可能我忽略了一件非常愚蠢的事情(度过了一个非常艰难的一周......(,但如果有人能启发我,将不胜感激。
谢谢!
抑制返回值的最简单形式,它使用$null = ...
:
$null = 2
其他在大多数情况下不太理想的选项包括2 >$null
、2 | Out-Null
、[void] (2)
[1]。
至于你尝试过的:
[void]::('2')
尝试访问名为2
的[void]
类型的静态成员(::
(,这是表达式('2')
计算的名称 - 这显然不是您的意图。
由于[void]
类型没有这样的静态成员(属性或方法(,因此$null
被有效地返回[2]- 并且$null
确实会得到管道的输出,因此您的函数有2个输出,$null
和$true
。
如果您在变量中捕获它,您将获得一个 2 元素[object[]]
数组 -$null, $true
- 它解释了您的症状。
[1] 有趣的是,尝试使用[void] (...)
作为表达式的一部分会导致Windows PowerShell中的错误在Windows PowerShell中生成错误(例如,([void] 1), 2
(,而在PowerShellCore中,它现在更明智地被视为$null
($null -eq (([void] 1), 2)[0]
验证(。
[2]请注意,您可以通过调用Set-StrictMode -Version 2
或更高版本来防止此类无意的方法/属性引用。 然后,您将收到以下语句终止错误:
The property '2' cannot be found on this object. Verify that the property exists.