public void ExpressionHeap_ShareGlobals() { var p0 = Expression.Parameter(typeof(int)); var p1 = Expression.Parameter(typeof(int)); var ps = new Expression[] { /* 0 */ p0, /* 1 */ p1, /* 2 */ Expression.Parameter(typeof(int), "test:foo"), /* 3 */ Expression.Parameter(typeof(int), "test:foo"), /* 4 */ Expression.Parameter(typeof(int), "test:bar"), /* 5 */ Expression.Parameter(typeof(int), "not:foo"), /* 6 */ Expression.Parameter(typeof(int), "not:foo"), /* 7 */ Expression.Parameter(typeof(long), "test:foo"), /* 8 */ Expression.Invoke(Expression.Lambda(p0, p0), p0), /* 9 */ Expression.Invoke(Expression.Lambda(p0, p0), p1), }; Assert.AreNotSame(ps[0], ps[1]); Assert.AreNotSame(ps[2], ps[3]); var heap = new TestHeap(); var rs = ps.Select(p => heap.Create(p)).ToArray(); Assert.AreNotSame(rs[0].Value, rs[1].Value); Assert.AreNotSame(rs[2].Value, rs[4].Value); Assert.AreNotSame(rs[5].Value, rs[6].Value); Assert.AreNotSame(rs[2].Value, rs[7].Value); Assert.AreSame(rs[2].Value, rs[3].Value); // Rebuild must be scoped Assert.AreSame(((InvocationExpression)ps[8]).Expression, ((InvocationExpression)rs[9].Value).Expression); }