2009-07-02 15 views
10

È possibile trasmettere una classe personalizzata a un tipo di valore?C#: Trasmissione personalizzata a un tipo di valore

Ecco un esempio:

var x = new Foo(); 
var y = (int) x; //Does not compile 

E 'possibile effettuare quanto sopra accada? Devo sovraccaricare qualcosa in Foo?

+0

Cosa ti aspetti che faccia? I.o.w, che aspetto ha Foo? –

risposta

23

È necessario sovraccaricare l'operatore di trasmissione.

public class Foo 
    { 
     public Foo(double d) 
     { 
      this.X = d; 
     } 

     public double X 
     { 
      get; 
      private set; 
     } 


     public static implicit operator Foo(double d) 
     { 
      return new Foo (d); 
     } 

     public static explicit operator double(Foo f) 
     { 
      return f.X; 
     } 

    } 
+0

Puoi spiegare l'uso di implicito ed esplicito nella tua risposta? Grazie. –

+0

vedere MSDN: http://msdn.microsoft.com/en-us/library/xhbhezf4(VS.80).aspx http://msdn.microsoft.com/en-us/library/z5z9kes2(VS .71) .aspx (Preferirei sempre operatori di cast espliciti) –

+1

Eccellente, esattamente quello che cercavo nella risposta. Saluti. –

6

Creare una conversione esplicita o implicita:

public class Foo 
{ 
    public static explicit operator int(Foo instance) 
    { 
     return 0; 
    } 

    public static implicit operator double(Foo instance) 
    { 
     return 0; 
    } 
} 

La differenza è, con le conversioni esplicite si dovrà fare il tipo di getto da soli:

int i = (int) new Foo(); 

e con le conversioni implicite, puoi semplicemente "assegnare" le cose:

double d = new Foo(); 

MSDN ha questo da dire:

"Eliminando i cast non necessari, le conversioni implicite possono migliorare la leggibilità del codice sorgente. Tuttavia, poiché le conversioni implicite non richiedono ai programmatori di eseguire il cast esplicito da un tipo all'altro, è necessario prestare attenzione per evitare risultati imprevisti. In generale, gli operatori di conversione impliciti non devono mai generare eccezioni e non perdere mai le informazioni in modo che possano essere utilizzate in modo sicuro senza la consapevolezza del programmatore. Se un operatore di conversione non può soddisfare tali criteri, deve essere contrassegnato esplicitamente. "(enfasi mia)

0

Un'altra possibilità è quella di scrivere un Parse e metodo di estensione TryParse per la classe

Farebbe quindi scrivere il codice come segue:.

var x = new Foo(); 
var y = int.Parse(x); 
+2

perché dovresti scriverlo come metodo di estensione e non come metodo di membro normale? È la sua classe, quindi ne ha il controllo. –

+2

Perché quando si ha un martello ogni problema è un chiodo. –

+1

@Mark: anche se hai scritto un metodo di estensione, non puoi usarlo con "var y = int.Parse (x);" perché i metodi di estensione si applicano solo alle istanze. Dovresti fare qualcosa come "var y = x.ParseToInt();" invece, e in quel caso, perché non inserire il metodo ParseToInt nella classe stessa, come dice Frederik. – LukeH

5

È necessario definire explicit o implicit casting:

public class Foo 
{ 
    public static implicit operator int(Foo d) 
    { 
     return d.SomeIntProperty; 
    } 

    // ... 
Problemi correlati