I was told that one of the many reasons strings were made immutable in the C# spec was to avoid the issue of HashTables having keys changed when references to the string key
If you're using a mutable reference type as a key, the default implementation of GetHashCode() will guarantee hash equality regardless of object state (i.e. the hash is tied to the reference, not the state). You're correct, however, that a mutable type with value equality semantics (where GetHashCode presumably depends on state) is a bad choice for a dictionary key.