In modo sorprendente, la soluzione al test è questa: compilate il seguente snippet J#:
public class a
{
public int GetHashCode()
{
return 15;
}
}
e referenziate l'assembly al vostro snippet C#:
class Test
{
static void Main()
{
System.Console.WriteLine(new a());
}
}
Come mai stampa a@f a console? Semplice! In Visual J# tutte le classi sovrascrivono implicitamente i metodi virtual MemberwiseClone() e ToString(), dove ToString() semplicemente ritorna com.ms.vjsharp.lang.ObjectImpl.jloToString(this) (dell'assembly vjslib.dll). E che stringa ritorna questo metodo jloToString?:
new StringBuilder(obj.GetType().FullName.Replace('+', '$')).Append('@').Append(Integer.toHexString(obj.GetHashCode()).ToString()).ToString()
ovvero il full name della classe (in cui per le classi nested i "+" vengono sostituiti da "$") concatenato con "@" e con il hash code esadecimale del parametro passato (nel nostro caso, obj). La classe Integer qui è del namespace java.lang.
Quindi, se il hash code della classe a è 15 (0xF), allora a console vedremo stampato a@f.
Non ha risposto nessuno... :-)
I versi del giorno:
"Don't move too fast if you want your love to last.
You've been movin' much too fast."
Jim Morrison - Take it as it comes.