Let's switch topic a bit.
Consider the following etude in C sharp (see *):
print(identical(#C, #C)); // true
print(identical((#C).toString(), (#C).toString()));//surprise:false
What follows from this gedanken experiment?
1) symbols are interned, like constant strings
2) symbol doesn't have a string representation inside
3) symbol doesn't even cache string representation when it becomes known.
Another observation: when you use symbols as keys to the map, the performance is horrible!
When you use #C as a key vs "C" as a key, the former is by 6 times slower than the latter.
Since the whole mirror system revolves around symbols, one needs symbols as keys very often.
Actually, I don't understand what's going on here. Fine, symbol doesn't contain string. But it certainly contains *something*. Why not compute hash code for this "something" and cache it?
In another experiment, I compared performance of Symbols as keys with performance of Symbol.toString() as key. The numbers are very close, so my working hypothesis is that Symbol (internally) converts itself to String each time when hashCode is requested. I have no other explanation for effect. Vyacheslav, Lasse: please disprove.
(*) I experimented also with the runs in F sharp - it made no difference whatever.