2016-01-22 17 views
7

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); 
    } 
} 
+2

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

+0

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

+2

@ 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

risposta

8

Il motivo è dovuto alla conversione implicita a Int32(Come probabilmente sapete).

Console.WriteLine ha molti sovraccarichi che richiedono String, Object e altri tra cui Int32.

Dal Point è implicitamente convertibile in Int32 la intoverload di Console.WriteLine viene utilizzato, che fa il casting implicita pure.

Questo può essere risolto da:

Console.WriteLine(new Point(1, 1).ToString()); 
Console.WriteLine((object)new Point(1, 1)); 

È possibile trovare maggiori su di esso in Overload Resolution in C#.

Altrimenti, il membro migliore funzione è il membro di una funzione che è meglio di tutti gli altri membri di funzione rispetto alla lista degli argomenti proposta , a condizione che ciascun membro funzione viene confrontato con tutti altri membri funzione utilizzando le regole in Section 7.4.2.2.

che ha ulteriormente:

7.4.2.2 Better function member

per ogni argomento, il conversione implicita da AX al PX non è peggiore della conversione implicita da AX al QX, e

2

Ciò è dovuto alla conversione implicita nel tipo di struct, ad es. Linee guenti:

  public static implicit operator Int32(Point p) 
      { 
       Console.WriteLine("Converted to Int32"); 
       return p.y + p.x; 
      } 

Quindi il compilatore sta prendendo in considerazione il tipo di punto come un intero, invocando il metodo di conversione implicita sopra.

Per risolvere questo problema, è necessario rimuovere la conversione implicita dal tipo o mettere un metodo ToString() mentre si fa Console.WriteLine()

Questo dovrebbe risolvere il problema. Spero che questo ti aiuti.

Miglior

Problemi correlati