Search code examples
powershellhashtable

Can I add a key named 'keys' to a hashtable without overriding the 'keys' member


It seems that I cannot add an arbitrary key name to a hashtable without overriding a member with that name if it already exists.

I create a hash table ($x) and add two keys, one and two:

$x = @{}

$x['one'] = 1
$x['two'] = 2

The added keys are then shown by evaluating $x.Keys:

$x.Keys

This prints:

one
two

If I add another key, named keys, it overrides the already existing member:

$x['Keys'] = 42

$x.Keys

This now prints:

42

I am not sure if I find this behavior desirable. I had expected $x.keys to print the key names and $x['keys'] to print 42.

Is it somehow possible to add a key named Keys without overriding the Keys member?


Solution

  • In your example, the member property Keys still exists. It is just no longer accessible using the member access operator syntax object.property. You can see the property by drilling down into the PSObject sub-properties.

    $x.PSObject.Members['Keys'].Value
    

    The documentation for Hash Tables considers the scenario for property collisions. The recommendation for those cases is to use hashtable.psbase.Property.

    $x.PSBase.Keys
    

    For cases where collisions are unpredictable, you can use the hidden member method get_Keys() as in this question.

    $hash.get_Keys()