为什么ConvertTo工作,但在某些情况下铸造失败?

时间:2010-01-04 00:24:35

标签: c# casting

我总是很好奇。

为什么这样做:

double Number = Convert.ToDouble(TextBox1.Text);

但这不是:

double Number = (double)TextBox1.Text;

4 个答案:

答案 0 :(得分:6)

只有在类型之间存在显式强制转换时才能进行强制转换。没有从字符串到double的显式强制转换。 Convert.ToDouble不是强制转换,它正在解析字符串并尝试将其转换为double。请注意,它不能保证成功,例如Convert.ToDouble("Hello there")

答案 1 :(得分:5)

我认为你要问的是......

当我在IDE中键入以下代码行时:

double Number = (double)TextBox1.Text;

为什么编译器无法将其隐式转换为:

double Number = Convert.ToDouble(TextBox1.Text);

此处的问题是您使用的是explicit cast。你真正对编译器说的是......

即使我将这块内存声明为X,我希望你把它当成Y.编译器很聪明,知道它是否可以完成。由于您尝试转换的内存块是System.String,因此编译器知道没有可能的方法将其视为System.Double。

静态Convert方法以编程方式解析一个值并在所需类型的内存中创建一个全新的值,而不是简单地在内存中使用相同的字节,就好像还有其他东西一样。

答案 2 :(得分:1)

TextBox1.Text是一种字符串类型,与double的类型不同。 Double不是来自string,而string并非来自double。因此,他们无法铸造。

对于可以进行转换的情况,有一个IConvertible interface,允许不同类型的对象相互转换。

答案 3 :(得分:0)

我认为这主要是其中一个类的作者的设计选择。一般来说,在从from-type更改为to-type时使用强制转换,并且在概念上是扩展或限制。例如,您可以将intshort视为double的受限制版本,将long视为byte的扩展名。

这些转化在概念上是微不足道的或规范的(尽管它们仍然可能失败,例如在将decimal投射到int并且decimal太大而无法适应时)。它们还在某种程度上镜像了类型层次结构和接口的向上和向下转换。 (你无法在C#中控制。)

例如,在处理字符串时,这已不再是显而易见的了,您谈论的是从一个域(文本)到完全独立的域(数字,日期等)的转换,您甚至可以考虑执行上下文(例如,当前CultureInfo)。这更适合更明确的Convert操作。