我一直都很好奇。爲什麼ConvertTo有效,但在某些情況下投射失敗?
爲什麼這項工作:
double Number = Convert.ToDouble(TextBox1.Text);
但這並不:
double Number = (double)TextBox1.Text;
我一直都很好奇。爲什麼ConvertTo有效,但在某些情況下投射失敗?
爲什麼這項工作:
double Number = Convert.ToDouble(TextBox1.Text);
但這並不:
double Number = (double)TextBox1.Text;
我想你問的是...
當我鍵入這行代碼到IDE:
double Number = (double)TextBox1.Text;
爲什麼不能編譯器把它變成這個含蓄:
double Number = Convert.ToDouble(TextBox1.Text);
這裏的問題是您正在使用explicit cast。你真的對編譯器說的是...
即使我宣佈這塊內存是X,我希望你把它當作是Y.編譯器很聰明,知道它是否可以完成或不。由於您嘗試轉換的內存塊是System.String,因此編譯器知道沒有可能的方式將它視爲System.Double。
靜態轉換方法以編程方式解析一個值並在所需類型的內存中創建一個全新的值,而不是像內存中一樣使用相同的字節。
如果類型之間存在顯式的轉換,您只能投。沒有從字符串顯式轉換爲double。 Convert.ToDouble不是強制轉換,而是解析字符串並嘗試將其轉換爲double。請注意,它不能保證成功,例如Convert.ToDouble("Hello there")
TextBox1.Text
是一個字符串類型,與double
不同。 Double
不是來源於string
,而string
也不是來自double
。因此,他們不能鑄造。
對於可以進行轉換的情況,有一個IConvertible interface,允許不同類型的對象彼此轉換。
我認爲這主要是一個類的作者的設計選擇。一般來說,從類型轉換爲類型時使用強制轉換,而周圍是概念上的擴展或限制。例如,您可以將int
和short
視爲限制版本double
,並將long
視爲byte
的擴展。
這些轉換是概念上微不足道的或經典的(當然,它們還可能會失敗,例如鑄造decimal
到int
當與decimal
過大,以適應)。它們也在某種程度上反映了沿類型層次結構和接口的向上和向下廣播。 (在C#中你無法控制)。
例如,在處理字符串時,這不再明顯,您正在討論從一個域(文本)到完全獨立的域(數字,日期等等),甚至考慮到執行上下文(例如,當前的CultureInfo
)。這更適合於更加明確的Convert
操作。