有從double到Int64的顯式轉換,但不能從你的類的Int64。所有你需要做的就是定義一個。或者,如果您的班級轉化爲雙倍班級,我認爲您可以這樣做:
long x =(long)(double)a;
但是,這很麻煩;我會定義顯式轉換運算符。
轉換應該是明確的,而不是隱含的,除非你有明確的理由。
語言定義的從雙倍到長的轉換是明確的,因爲轉換可能會導致信息丟失。由於有一些雙打,比如0.5,不能完全轉換爲長時間,因此您可能會因此轉換而丟失信息。這被稱爲縮小轉換。
使用語言定義的轉換,縮小轉換是明確的。如果它們是隱式的,程序員可能會通過將一個類型的值賦給另一個類型的變量而意外丟失信息。將這種轉換定義爲隱含的違反了完全合理的原則,因此必須有一些令人信服的理由。
下面是一個例子,顯示了這個原理的價值。如果縮小轉換次數是隱含的,則會使代碼變得更脆弱。假設雙重轉換爲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);
}
哎呀,一切都編譯和運行!當然很高興我們發現了這個bug!
但是,可悲的是,沒有。 我們還有一個bug!SomeMethod
隱式地將double轉換爲int,所以在期望值可能爲2.4
的情況下,實際值爲2
。
由於double-to-int轉換爲顯式,編譯器將我們從我們身上拯救出來。在修復GetAverageNumberOfChildren
,之後,錯誤的程序不能編譯。現在
,如果你的MyDouble
類有一些驗證是限制它等於或大於long
範圍小的範圍內的整數值,那麼你就可以安全地進行轉換隱。但在這種情況下,當然,您應該使用long
,而不是double
。
爲什麼你同時使用'long'和'Int64'?一個是另一個的aloas,我認爲更習慣的方式是使用別名,如果它們存在而不是類型名稱。 – Joey 2012-02-29 07:10:40