简体   繁体   中英

Boolean variable gets returned as an Object[]

I have a function which is returning a boolean variable

function test ($param1, $param2)
{
  [boolean]$match=$false;

  <# function logic #>

  return $match
}

when I try and catch the function call in a variable $retByFunct=testing $param1 $param 2

I am getting $retByFunct as an Object Array. If I try and force the $retByFunct to be a boolean variable ie [boolean] $retByFunct=testing $param1 $param 2, I get the following error.

Cannot convert value "System.Object[]" to type System.Boolean

I checked out $match.GetType() just before returning it. The console says its a boolean, so am confused as to why after function call its getting converted to an Object Array.

I am aware this happens for some collection objects and there is a work around for that, but how do I handle a case for a variable?

As @mjolinor said, you need to show the rest of your code. I suspect it's generating output on the success output stream somewhere. PowerShell functions return all output on that stream, not just the argument of the return keyword. From the documentation :

In PowerShell, the results of each statement are returned as output, even without a statement that contains the Return keyword. Languages like C or C# return only the value or values that are specified by the return keyword.

There's no difference between

function Foo {
  'foo'
}

or

function Foo {
  'foo'
  return
}

or

function Foo {
  return 'foo'
}

Each of the above functions returns the string foo when called.

Additional output causes the returned value to be an array, eg:

function Foo {
  $v = 'bar'
  Write-Output 'foo'
  return $v
}

This function returns an array 'foo', 'bar' .

You can suppress undesired output by redirecting it to $null :

function Foo {
  $v = 'bar'
  Write-Output 'foo' | Out-Null
  Write-Output 'foo' >$null
  return $v
}

or by capturing it in a variable:

function Foo {
  $v = 'bar'
  $captured = Write-Output 'foo'
  return $v
}

return something ## is not the only thing that PowerShell returns. This is one of the gotchas of PowerShell, if you will. All output on the success output stream will also be returned. that's why you have an array of objects returning from your function.

function test {
  "hello"
  return "world"
}

$mytest=test
$mytest 

try the code above... you will not get just "world" but "hello" "world"

$mytest.count
2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM