问题
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?
回答1:
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()
来源:https://stackoverflow.com/questions/60803441/can-i-add-a-key-named-keys-to-a-hashtable-without-overriding-the-keys-member