The problem with your code is that PowerShell cannot decide to which specific delegate type the ScriptBlock
instance ({ ... }
) should be cast.
So it isn’t able to choose a type-concrete delegate instantiation for the generic 2nd parameter of the Where
method. And it also does’t have syntax to specify a generic parameter explicitly. To resolve this problem, you need to cast the ScriptBlock
instance to the right delegate type yourself:
$data = 0..10
[System.Linq.Enumerable]::Where($data, [Func[object,bool]]{ param($x) $x -gt 5 })
Why does
[Func[object, bool]]
work, but[Func[int, bool]]
does not?
Because your $data
is [object[]]
, not [int[]]
, given that PowerShell creates [object[]]
arrays by default; you can, however, construct [int[]]
instances explicitly:
$intdata = [int[]]$data
[System.Linq.Enumerable]::Where($intdata, [Func[int,bool]]{ param($x) $x -gt 5 })