На мой взгляд, это зависит от реализации Point3.Equals ().
Рассмотрим следующий код:
Dictionary<Point3, string> cache;
Point3 pointA = new Point3(1, 2, 3);
Point3 pointB = new Point3(1, 2, 3);
cached[pointA] = "Value Aaa";
cached[pointB] = "Value Bbb";
Console.WriteLine(cached[pointA]);
Console.WriteLine(cached[pointB]);
Если Point3 имеет ссылочную семантику (pointA.Equals (pointB), когда они являются одним и тем же объектом), будет выведено:
Value Aaa
Value Bbb
Если Point3 имеет семантику значений (pointA.Equals (pointB), когда их значения x, y и z равны),
это выведет:
Value Bbb
Value Bbb
При семантике значений на самом деле не имеет значения, создаете ли вы новый объект или нет. Вы можете просто вернуть то же самое, чтобы избежать создания мусора.
Если у вашего типа есть ссылочная семантика, вы, вероятно, захотите, чтобы унарный плюс создал новый объект, чтобы он вел себя так же, как и другие операторы.