C#中(double)str;與Convert.ToDouble(str);有什么區別


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM