。あなたがする必要があるのは、1つを定義することだけです。あなたのクラスから二重への変換があれば、これを行うことができます:
long x =(long)(double)a;
しかし、それは面倒です。明示的な変換演算子を定義します。
明示的にする理由がない限り、変換は明示的で暗黙的ではありません。
変換によって情報が失われる可能性があるため、言語定義のdoubleからlongへの変換は明示的にです。この変換では、0.5、などの倍数が正確にlongに変換されないため、情報が失われる可能性があります。これは、変換の絞り込みと呼ばれます。
言語定義のコンバージョンでは、コンバージョンの絞り込みは明示的です。それらが暗黙的であった場合、あるタイプの値を別のタイプの変数に割り当てることによって、プログラマーは誤って情報を失う可能性があります。この変換を暗黙的に定義することは、完全に合理的な原則に違反するため、そうするためには説得力のあるケースが必要です。
この原則の価値を示す例です。狭い変換が暗黙のうちに行われると、コードがより脆くなります。 double-to-int変換が暗黙的であると仮定します。
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);
//...
}
バグがあります! GetAverageNumberOfChildren
はダブルを返す必要があります!それを修正しよう!
double GetAverageNumberOfChildren(IEnumerable<Family> families)
{
return families.Average(f => f.Children.Count);
}
すべてがコンパイルされて実行されます。確かに私たちはそのバグをキャッチしてうれしい!
しかし、悲しいことに、 まだバグがあります!SomeMethod
はdoubleをintに暗黙的に変換するため、期待値が2.4
である場合、実際の値は2
です。
double-to-int変換は明示的であるため、コンパイラは私たち自身から私たちを保存します。 GetAverageNumberOfChildren
を修正した後、は、誤ったプログラムがコンパイルされません。あなたのMyDouble
クラスと同じかlong
の範囲よりも小さい範囲で値を整数にそれを制限されたいくつかの検証を持っていた場合
さて、あなたは変換が暗黙的にするためにも安全でしょう。しかし、その場合は、long
を使用してください(double
ではなく)。
なぜ、「long」と「Int64」の両方を使用していますか? 1つは別のもののためのaloasであり、私は、より多くの慣用的な方法が型名の代わりに存在するなら、エイリアスを使用することだと思います。 – Joey