Quando scrivo Console.WriteLine(new Point (1,1));
non chiama il metodo ToString
. Ma converte l'oggetto in Int32
e lo scrive nella console. Ma perché? Sembra che ignori il metodo sovrascritto ToString
.Sovrascrittura del metodo virtuale in tipo con metodo di conversione
struct Point
{
public Int32 x;
public Int32 y;
public Point(Int32 x1,Int32 y1)
{
x = x1;
y = y1;
}
public static Point operator +(Point p1, Point p2)
{
return new Point(p1.x + p2.x, p1.y + p2.y);
}
public static implicit operator Int32(Point p)
{
Console.WriteLine("Converted to Int32");
return p.y + p.x;
}
public override string ToString()
{
return String.Format("x = {0} | y = {1}", x, y);
}
}
Dal 'Int32' eredita da' Object', conversione 'Point' ->' Int32' è più specifico di 'Point' ->' Object', in modo che 'Console.WriteLine (Int32)' preferito su 'Console.WriteLine (Object)'. – PetSerAl
Qual è l'output effettivo di 'Console.WriteLine (new Point (1,1));'? [Secondo MSDN] (https://msdn.microsoft.com/en-us/library/swx4tc5e (v = vs.110) .aspx) dovrebbe chiamare 'ToString()' sull'oggetto che viene passato. Sei sicuro che stia usando la tua struttura 'Point' e non la struttura' System.Drawing.Point' di default? – sab669
@ sab669 - Ciò che potrebbe accadere è che il compilatore prima esegue la conversione implicita, quindi chiama il sovraccarico 'WriteLine (int)', in opposizione a quello 'WriteLine (oggetto)', perché le ragioni del livello dell'avvocato linguistico. – millimoose