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);有什么区别的更多相关文章

  1. C#中(int)a和Convert.ToInt32(a)有什么区别

    首先,在 C# 中,int 其实就是 System.Int32,即都是32位的. 其次,(int) 和 Convert.ToInt32 是两个不同的概念,前者是类型转换,而后者则是内容转换,它们并不总 ...

  2. 【转载】C#中Convert.ToDouble方法将字符串转换为double类型

    在C#编程过程中,可以使用Convert.ToDouble方法将字符串或者其他可转换为数字的对象变量转换为double类型,Convert.ToDouble方法有多个重载方法,最常使用的一个方法将字符 ...

  3. 读入一个字符串str,输出字符串str中连续最长的数字串

    要求: 读入一个长度不超过256的字符串,例如“abc123defg123456789hjfs123456”.要求输出“123456789” 思路: 遍历字符串,如果是数字串则计算往后一共有多少个数字 ...

  4. python中的基本数据类型(int,bool,str)及字符串操作

    一. 基本数据类型概况 1.  int 整数,主要用来进行数学运算 2.  str 字符串,可以保存少量数据并进行相应的操作 3.  bool 布尔值,判断真假,True,False 4.  list ...

  5. c#中关于Convert.ToDouble的一个注意事项

    今天在写代码的时候被一个小细节坑了,以前没注意,现在才发现,代码如下: private void btnChangeCartonID_Click(object sender, EventArgs e) ...

  6. c++ 中double与string之间的转换,char *

    运行代码为 /* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> //#inc ...

  7. python产生错误:can only concatenate str (not "int") to str

    代码为: #!/usr/bin/python # _*_ coding:utf-8_*_ # print("hello world!") name = input("na ...

  8. java中double变量保留小数问题

    (转载自玄影池扁舟) 做java项目的时候可能经常会遇到double类型变量保留小数的问题,下面便把我的经验做个简短的总结: java中double类型变量保留小数问题大体分两种情况: (一):小数点 ...

  9. 解决cocos2dx在Xcode中运行时报:convert: iCCP: known incorrect sRGB profile 的问题

    解决cocos2dx在Xcode中运行时报:convert: iCCP: known incorrect sRGB profile 的问题 本文的实践来源是参照了两个帖子完成的: http://dis ...

随机推荐

  1. java collection.sort()根据时间排序list

    首先:定义bean 然后:定义比较器 最后:测试使用 一.userBean package com.butterfly.Class; public class user { private Strin ...

  2. requests 模块

    发送请求 使用Requests发送网络请求非常简单. 一开始要导入Requests模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取Gith ...

  3. Dedecms去掉URL中a目录的方法

    本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...

  4. python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决

    python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'的解决方法: 1.原因是官网的是python2语法写的,看官手动把官 ...

  5. Java的多线程机制系列:(一)总述及基础概念

    前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...

  6. Angular作用域的层级概念(scope)

    首先引入 angular 的根作用域:$rootScope ng-app:定义了angualr的作用域 ng-controller:定义了控制器 $scope定义了视图与控制器之间的纽带,而scope ...

  7. Django简单的数据库操作

    当然,本篇的前提是你已经配置好了相关的环境,这里就不详细介绍. 一. 在settings.py文件中设置数据库属性. 如下: DATABASES = { 'default': { 'ENGINE': ...

  8. 网站访问量大 怎样优化mysql数据库

    MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是 MySQL安装时的编译优化,三是自身配置文件my.cnf的优化:如果单机的优化也解决不了你的数据库的压力的 ...

  9. 图解JVM的类加载机制(详细版)

    注:本文为作者整理和原创,如有转载,请注明出处. 上一篇博文,把JAVA中的Class文件格式用图形的方式画了一下,逻辑感觉清晰多了,同时,也为以后查阅的方便. Class文件只是一种静态格式的二进制 ...

  10. TypeError: 'bool' object is not callable g.user.is_authenticated()

    此问题查了stackoverflow后知道is_authenticated是一个属性而不是一个方法所以g.user.is_authenticated() 用法会报错