C#中(double)str;与Convert.ToDouble(str);有什么区别?
小弟初学C#,很多地方弄不明白。大家帮忙解答一下:)
1. string str = "32323";
2. double a = (double)str ;
3. double a = Convert.ToDouble(str);
第3行会转换成功,第2行就会报错,书上讲是ToDouble方法会自动进行溢出检查,上面的实例好像不只是样啊,为什么第2行会失败?
问题点数:20、回复次数:6Top
1 楼Knight94(愚翁)回复于 2006-07-02 10:09:20 得分 5
string => double:
Method1: double.TryParse
Method2: Convert.ToDouble
Top
2 楼diandian82(点点(nothing))回复于 2006-07-02 10:46:14 得分 5
str是个对象,又不是指针,当然不能直接那样转了.它们在内存中的分布也是不一样的。Top
3 楼SiteManage(SiteManage)回复于 2006-07-02 11:20:40 得分 10
楼上说得有道理, 我也补充一点
在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, 上面会有很详细的说明
Top
4 楼SiteManage(SiteManage)回复于 2006-07-02 11:23:11 得分 0
补充一个 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;
Top
5 楼blueboyzme()回复于 2006-07-02 11:27:55 得分 0
楼上是高手,佩服,我编程的时候也常常遇到这样的问题,一般用强制转换不行就用convert.to+要转换的类型,没有研究过原理,上面说的是一个是值类型一个是引用,在内存的分布不同。Top
6 楼wztgq(♂T_gq♀)回复于 2006-07-04 18:34:18 得分 0
学到了不少,不过有的地方还不是很懂!Top




