title: PowerShell changes return object's type
body: <p>I am using PowerShell v3 and the Windows PowerShell ISE.  I have the following function that works fine:</p>
  
  <pre><code>function Get-XmlNode([xml]$XmlDocument, [string]$NodePath, [string]$NamespaceURI = "", [string]$NodeSeparatorCharacter = '.')
  {
      # If a Namespace URI was not given, use the Xml document's default namespace.
      if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $XmlDocument.DocumentElement.NamespaceURI }   
  
      # In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
      [System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($XmlDocument.NameTable)
      $xmlNsManager.AddNamespace("ns", $NamespaceURI)
  
      [string]$fullyQualifiedNodePath = Get-FullyQualifiedXmlNodePath -NodePath $NodePath -NodeSeparatorCharacter $NodeSeparatorCharacter
  
      # Try and get the node, then return it. Returns $null if the node was not found.
      $node = $XmlDocument.SelectSingleNode($fullyQualifiedNodePath, $xmlNsManager)
      return $node
  }
  </code></pre>
  
  <p>Now, I will be creating a few similar functions, so I want to break the first 3 lines out into a new function so that I don't have to copy-paste them everywhere, so I have done this:</p>
  
  <pre><code>function Get-XmlNamespaceManager([xml]$XmlDocument, [string]$NamespaceURI = "")
  {
      # If a Namespace URI was not given, use the Xml document's default namespace.
      if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $XmlDocument.DocumentElement.NamespaceURI }   
  
      # In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
      [System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($XmlDocument.NameTable)
      $xmlNsManager.AddNamespace("ns", $NamespaceURI)
      return $xmlNsManager
  }
  
  function Get-XmlNode([xml]$XmlDocument, [string]$NodePath, [string]$NamespaceURI = "", [string]$NodeSeparatorCharacter = '.')
  {
      [System.Xml.XmlNamespaceManager]$xmlNsManager = Get-XmlNamespaceManager -XmlDocument $XmlDocument -NamespaceURI $NamespaceURI
      [string]$fullyQualifiedNodePath = Get-FullyQualifiedXmlNodePath -NodePath $NodePath -NodeSeparatorCharacter $NodeSeparatorCharacter
  
      # Try and get the node, then return it. Returns $null if the node was not found.
      $node = $XmlDocument.SelectSingleNode($fullyQualifiedNodePath, $xmlNsManager)
      return $node
  }
  </code></pre>
  
  <p>The problem is that when "return $xmlNsManager" executes the following error is thrown:</p>
  
  <pre><code>Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Xml.XmlNamespaceManager".
  </code></pre>
  
  <p>So even though I have explicitly cast my $xmlNsManager variables to be of type System.Xml.XmlNamespaceManager, when it gets returned from the Get-XmlNamespaceManager function PowerShell is converting it to an Object array.</p>
  
  <p>If I don't explicitly cast the value returned from the Get-XmlNamespaceManager function to System.Xml.XmlNamespaceManager, then the following error is thrown from the .SelectSingleNode() function because the wrong data type is being passed into the function's 2nd parameter.</p>
  
  <pre><code>Cannot find an overload for "SelectSingleNode" and the argument count: "2".
  </code></pre>
  
  <p>So for some reason PowerShell is not maintaining the data type of the return variable.  I would really like to get this working from a function so that I don't have to copy-paste those 3 lines all over the place.  Any suggestions are appreciated.  Thanks.</p>