title: Strange difference between $_ and [parameter(ValueFromPipeline=$true)]
body: <p>I've come to the edge of my PoweShell-fu.  Can someone explain to me why these two functions act differently when piping an array of arrays?  All that's different is whether I'm using <code>$_</code> or <code>[parameter(ValueFromPipeline=$true)] $input</code> to get at the piped input. I expected those to act identically in this situation.</p>
  
  <pre><code>$pairs = ('a', 'b'), ('c', 'd')
  
  function dollarUnderscoreFunction
  {
      Process
      {
          Write-Host "`$_[0] = $($_[0])"
          Write-Host "`$_[1] = $($_[1])"
      }
  }
  
  function pipedParameterFunction([parameter(ValueFromPipeline=$true)] $input)
  {
      Process
      {
          Write-Host "`$input[0] = $($input[0])"
          Write-Host "`$input[1] = $($input[1])"
      }
  }
  
  Write-Host "`$pairs:"
  $pairs | foreach { Write-Host $_ }
  
  Write-Host "`nRunning dollarUnderscoreFunction`n"
  $pairs | dollarUnderscoreFunction
  
  Write-Host "`nRunning pipedParameterFunction`n"
  $pairs | pipedParameterFunction
  </code></pre>
  
  <p><strong>Output in PowerShell v3:</strong></p>
  
  <pre><code>$pairs:
  a b
  c d
  
  Running dollarUnderscoreFunction
  
  $_[0] = a
  $_[1] = b
  $_[0] = c
  $_[1] = d
  
  Running pipedParameterFunction
  
  $input[0] = a b
  $input[1] =
  $input[0] = c d
  $input[1] =
  </code></pre>
  
  <p><strong>Output in PowerShell v2:</strong></p>
  
  <pre><code>$pairs:
  a b
  c d
  
  Running dollarUnderscoreFunction
  
  $_[0] = a
  $_[1] = b
  $_[0] = c
  $_[1] = d
  
  Running pipedParameterFunction
  
  [ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
  At C:\Untitled1.ps1:16 char:8
  + $input[ &lt;&lt;&lt;&lt; 0]
      + CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException
      + FullyQualifiedErrorId : CannotIndex
  
  $input[0] =
  [ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
  At C:\Untitled1.ps1:17 char:8
  + $input[ &lt;&lt;&lt;&lt; 1]
      + CategoryInfo          : InvalidOperation: (1:Int32) [], RuntimeException
      + FullyQualifiedErrorId : CannotIndex
  
  $input[1] =
  [ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
  At C:\Untitled1.ps1:16 char:8
  + $input[ &lt;&lt;&lt;&lt; 0]
      + CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException
      + FullyQualifiedErrorId : CannotIndex
  
  $input[0] =
  [ : Unable to index into an object of type System.Collections.ArrayList+ArrayListEnumeratorSimple.
  At C:\Untitled1.ps1:17 char:8
  + $input[ &lt;&lt;&lt;&lt; 1]
      + CategoryInfo          : InvalidOperation: (1:Int32) [], RuntimeException
      + FullyQualifiedErrorId : CannotIndex
  
  $input[1] =
  </code></pre>