title: Complex data types, byReference arguments and data not changing as expected
body: <p>I have a function that can either initialize itself and return an ordered dictionary with initial values, or if a collection is provided as an argument, it manipulates that collection. And that collection is a key within a parent collection.</p>
  <p>In my actual code I am seeing an odd behavior, where a key in the initial collection is initially <code>$Null</code> or has a specified value, but when I try to revise that value I do NOT get an error, but I also do not get a changed value. However, when I try creating a minimally functional example to post here, it does work correctly, both in the console and the IDE.</p>
  <p>So, given this code</p>
  <pre><code>function Write-Data {
      param (
          [System.Collections.Specialized.OrderedDictionary]$Collection
      )
  
      foreach ($key in $Collection.Keys) {
          try {
              $type = $Collection.$key.GetType().FullName
          } catch {
              $type = 'NULL'
          }
          Write-Host &quot;$key $type $($Collection.$key)&quot;
      }
      Write-Host
  }
  
  function Manage-Data {
      param (
          [System.Collections.Specialized.OrderedDictionary]$Collection
      )
  
      if (-not $Collection) {
          [System.Collections.Specialized.OrderedDictionary]$initialCollection = [Ordered]@{
              initialNull = $null
              initialString = 'initial string'
          }
          return $initialCollection
      } else {
          $Collection.initialNull = 'No longer null'
          $Collection.initialString = 'New String'
      }
  }
  
  CLS
  $parentContainer = New-Object System.Collections.Specialized.OrderedDictionary
  $parentContainer.Add('data', (Manage-Data))
  
  Write-Data $parentContainer.data
  Manage-Data -Collection $parentContainer.data
  Write-Data $parentContainer.data
  </code></pre>
  <p>is there any obvious scenario where either of the lines revising values would not throw an error, but would also not change the value? For example, if there are actually more functions doing other things with that initialized collection object before the attempt to revise data? Or perhaps more generally, since I am depending on the default <code>byReference</code> behavior of complex objects, is there some situation where this behavior breaks down and I am effectively modifying a new complex object when I think I am modifying the original? Or is the fact that I am having problems with a simple data type within the complex type potentially the issue?</p>
  <p>For what it is worth, the idea here is to basically be able to use Dependency Injection, but with functions rather than classes, and also mimic to some extent the the concept of a constructor and a method in a class, but again in a function. And that has generally been working well, if a little messy, which has reenforced in my mind that I need to move to classes eventually. But this particular issue has me worried that I will see the same problem in classes, and unless I can understand it now I will have issues. But since I can't seem to recreate the issue in a simplified example, I seem to be unable to figure anything out.</p>
  <p>It occurs to me that one thing I haven't tried is to actually get the memory address of the collection I think I am modifying, or even of the individual key, so I can verify I actually am changing the same data that I initialized. But HOW to get the memory address of a variable escapes me, and is maybe not possible in PowerShell or .NET?</p>