1. string str = "32323";
2. double a = (double)str ;
3. double a = Convert.ToDouble(str);
第3行會轉換成功,第2行就會報錯,ToDouble方法會自動進行溢出檢查,但是為什么第2行會失敗?
轉換方法
Method1: double.TryParse
Method2: Convert.ToDouble
str是個對象,不是指針,所以不能直接那樣轉。它們在內存中的分布也是不一樣的。
在C#中, 類似於(double)str的這種數據類型轉換, 被稱為"顯式強制轉換", 而實現它的機制, 其實是 調用了一個在對象類型內部定義的方法, 其聲明方式類似於下:
public static explicit operator double(int a)
{
...
}
其中的方法名 double 表示要轉換的目標類型名稱, 而參數則是要轉換的源類型, 返回是operater。
所以, 第二行會報錯的原因是因為在 double 的類型聲明中, 沒有定義 double(int a)的這種函數。
而至於Convert.ToDouble(str); 或者說TryParse, 其實現原理又與上面的不太一致, 他們的內部是實現了一個叫做 IConvertable的接口, 在MSDN, 會發現在很多基礎類型的聲明中, 都實現了這個叫做IConvertible的接口, 具體IConvertible的詳細信息, MSDN中會有很詳細的說明。
補充一個 MSDN 中的例子
// Must be defined inside a class called Farenheit:
public static explicit operator Celsius(Farenheit f)
{
return new Celsius((5.0f/9.0f)*(f.degrees-32));
}
調用的時候如下使用
Farenheit f = new Farenheit(100.0f);
Celsius c = (Celsius)f;