C#中(double)str;与Convert.ToDouble(str);有什么区别

Posted 苏州城外的微笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于C#中(double)str;与Convert.ToDouble(str);有什么区别的主要内容,如果未能解决你的问题,请参考以下文章

C# double.TryParse 与 InvariantCulture 返回意外结果

C#如何将double转为char

C# 与 LUA 的经验对比

C#如何将double转为char

C# decimal double 之间进行运算

c++ int,double等数字类型与string的相互转换