C'è una conversione esplicita da double a Int64, ma non dalla tua classe a Int64. tutto ciò che devi fare è definirne uno. Oppure, se hai una conversione dalla tua classe al raddoppio, quale suppongo tu faccia, potresti fare questo:
lungo x = (lungo) (doppio) a;
Tuttavia, questo è ingombrante; Definirei l'operatore di conversione esplicita.
La conversione deve essere esplicita, non implicita, a meno che non si abbia una buona ragione per renderla esplicita.
La conversione definita dalla lingua da doppio a lungo è esplicita perché la conversione potrebbe causare la perdita di informazioni. Puoi perdere informazioni con questa conversione perché ci sono alcuni doppi, come 0.5, che non convergono esattamente a lungo. Questa è chiamata una conversione di restringimento .
Con le conversioni definite dalla lingua, le conversioni di restringimento sono esplicite. Se fossero impliciti, i programmatori potrebbero perdere accidentalmente informazioni assegnando un valore di un tipo a una variabile di un altro tipo. Definire questa conversione come implicita viola quel principio del tutto ragionevole, quindi ci dovrebbe essere un caso convincente per farlo.
Ecco un esempio che mostra il valore di questo principio. Se il restringimento delle conversioni fosse implicito, renderebbe il codice più fragile. Supponiamo che la conversione da doppia a int sia implicita:
class Family
{
ICollection<Person> Children { get; set; }
}
int GetAverageNumberOfChildren(IEnumerable<Family> families)
{
return families.Sum(f => f.Children.Count)/families.Count();
}
void SomeMethod(IEnumerable<Family> families)
{
int averageNumberOfChildren = GetAverageNumberOfChildren(families);
//...
}
Oops! Abbiamo un bug! GetAverageNumberOfChildren
dovrebbe restituire un doppio! Risolviamolo!
double GetAverageNumberOfChildren(IEnumerable<Family> families)
{
return families.Average(f => f.Children.Count);
}
Wow, tutto si compila e funziona! Di sicuro contento che abbiamo beccato quell'insetto!
Ma, purtroppo, no. Abbiamo ancora un bug!SomeMethod
converte implicitamente il doppio in un valore int, quindi, se il valore previsto potrebbe essere 2.4
, il valore effettivo è 2
.
Poiché la conversione da doppio a int è esplicita, il compilatore ci salva da noi stessi. Dopo aver corretto GetAverageNumberOfChildren
, , il programma errato non viene compilato.
Ora, se la classe MyDouble
aveva un po 'di convalida che limitato a valori interi con una gamma uguale o inferiore alla gamma di long
, allora si sarebbe sicuro per effettuare la conversione implicita. Ma in quel caso, ovviamente, dovresti usare long
, non double
.
Perché si usano sia 'long' che' Int64'? Uno è un aloas per l'altro e penso che il modo più idiomatico sia usare gli alias se esistono al posto dei nomi dei tipi. – Joey