[Test] public void testEquals()
        {
            GenericStack <string>         stringStack     = new GenericStack <string>();
            GenericStack <string>         stringStack2    = new GenericStack <string>();
            GenericStack <List <string> > stringListStack = new GenericStack <List <string> >();

            // System.out.println("stringStack type is " + stringStack.getClass());
            // XXX What!?
            // Assert.True(stringStack == (stringListStack)); // see note in equals
            // Assert.True(stringStack == (stringStack2));

            Assert.AreEqual(stringStack.GetHashCode(), stringStack2.GetHashCode());
            // Assert.AreEqual(stringStack.GetHashCode(), stringListStack.GetHashCode()); // see note in equals
            // XXX C# doesn't do type erasure so this doesn't work anymore. Thankfully.
            Assert.AreNotEqual(stringStack.GetHashCode(), stringListStack.GetHashCode());

            stringStack.Push("value 1");
            Assert.False(stringStack == (stringStack2));
            // Assert.False(stringStack == (stringListStack));
            Assert.False(stringStack.GetHashCode() == stringStack2.GetHashCode());

            stringStack2.Push("value 1");
            Assert.True(stringStack.Equals(stringStack2));

            Assert.AreEqual(stringStack.GetHashCode(), stringStack2.GetHashCode());
        }