Name indirection can substitute only a name value. The second SET command in the following example returns an error message because of the context. When evaluating the expression to the right of the equal sign, Caché interprets @var1 as an indirect reference to a variable name, not a numeric value.

SET var1 = "5"  SET x = @var1*6
You can recast the example to execute correctly as follows:
SET var1 = "var2",var2 = 5  SET x = @var1*6

My natural inclination would be to use NameIDX for an index; which goes back to me saying that naming is so unrestricted and easy, earlier.  A lot of my early programming experience came from school, where the Department saddled us with the use of a custom implementation of C++ which forced heavy abstraction with strict definition rules, everything was black-box components.  To keep sane you had to name carefully, I guess I internalized that more than I thought.  Sorry to distract from the discussion.

Honestly, John, the idea of NOT using unique names is foreign to me, I do not understand why someone would be tempted to do so.  To me it would seem illogical to create members with the same name because I would question whether that member's function is needed and makes sense in the design.  Plus, naming is not restrictive so it is too easy to make names unique.  Class,Name, Class.GetName, Class.Names, Class.Name.Assign; I would only confuse myself calling all those just Class.Name and wonder if they are all needed; if Class.GetName will always give me the same as Class.Name, why have it?  Maybe I am missing the point, but that's my take.