Istnieje wyraźna konwersja z double do Int64, ale nie ze swojej klasy Int64. wszystko, co musisz zrobić, to zdefiniować jeden. Lub, jeśli masz konwersję z klasy na podwójną, co, jak przypuszczam, możesz zrobić:
długa x = (długa) (podwójna) a;
Jednak jest to uciążliwe; Zdefiniuję operatora konwersji jawnej.
Konwersja powinna być wyraźna, a nie domniemana, chyba że masz dobry powód, aby ją jasno wyrazić.
Konwersja języka z podwójnej na długą jest jawna , ponieważ konwersja może spowodować utratę informacji. Możesz utracić informacje związane z tą konwersją, ponieważ istnieją pewne liczby podwójne, takie jak 0,5, , które nie są konwertowane dokładnie na długie. Nazywa się to przekształcaniem zwężającym .
W przypadku konwersji według języka zawężanie konwersji jest jawne. Gdyby były niejawne, programiści mogliby przypadkowo utracić informacje, przypisując wartość jednego typu do zmiennej innego typu. Zdefiniowanie tej konwersji jako niejawnej narusza tę całkowicie rozsądną zasadę, więc musiałoby to być przekonujące.
Oto przykład pokazujący wartość tej zasady. Jeśli zawężenie konwersji było niejawne, spowodowałoby to, że kod byłby bardziej kruchy. Załóżmy, że konwersja podwójna na int jest domyślna:
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);
//...
}
Ups! Mamy błąd! GetAverageNumberOfChildren
powinien zwrócić double! Naprawmy to!
double GetAverageNumberOfChildren(IEnumerable<Family> families)
{
return families.Average(f => f.Children.Count);
}
Uff, wszystko się kompiluje i działa! Na szczęście cieliśmy się tym błędem!
Ale, niestety, nie. Nadal mamy błąd!SomeMethod
niejawnie konwertuje wartość podwójną na int, więc jeśli oczekiwana wartość to 2.4
, faktyczna wartość to 2
.
Ponieważ konwersja podwójna na int jest jawna, kompilator ratuje nas przed nami. Po naprawieniu błędu GetAverageNumberOfChildren
, błędny program nie zostanie skompilowany.
Teraz, jeśli twoja klasa MyDouble
miał jakieś walidacji że ograniczony ją do liczby całkowitej wartości z zakresu równego lub mniejszego niż zakres long
, wtedy będzie bezpieczna, aby konwersja niejawna. Ale w takim przypadku powinieneś oczywiście używać long
, a nie double
.
Dlaczego używasz zarówno 'long' i' Int64'? Jeden jest aloasem dla drugiego i myślę, że bardziej idiomatyczny sposób polega na użyciu aliasów, jeśli istnieją zamiast nazw typów. – Joey