今天在看一篇有关数据类型的文章的时候,无意间看到了两个关键词,“隐式转换”与“显示转换”,然后突然想起了当初开始学编程的时候,也总是在代码编译的时候遇到这样的问题。

那么,今天刚好有空来总结一下这两者之间到底存在着怎么样的关系。

先来看看如下几个问题:

我先定义了一个变量:

string a = ;

这个只要是有点常识的人都可以一眼看出问题所在。

然后在看看如下代码:

double d1 = ;
float f1 = d1;

按我们所预料的那样,现在我们试着尝试编译一下,然后通过控制台输出f1。

结果尽然编译的时候都无法通过,报出如下异常:

然后再看看如下代码:

float f1 = ;
double d1 = f1;
Console.WriteLine(f1);

再编译,并运行。结果是编译成功,并完美运行:

面对第一个编译时出现的转换,我们稍作修改,修改如下:

double d1 = ;
float f1 = (float)d1;

然后编译,运行,结果是完美运行:

看到如此场景,有人会觉得好奇怪。

这里就关系到了我们之前所说的隐式转换与显示转换。


隐式转化:即数据的类型的转换由编译器自动进行的,不需要人工干预的数据转换。

显示转换:与隐式转换相反的数据类型的转换,即需要人为强制干预的数据转换。

而上述三段代码编译和运行,第一、第二段代码的转换就属于隐式转换,而第三段代码则是使用了显示转换后才正确的执行。

那什么情况下两个数据数据类型之间只需要隐式转换就可以实现转换,而什么情况下却有需要进行强制转换。

下面先来看一张表:

看完这张表,我们会发现float类型表示的是32位的浮点值,而double类型表示的是64位的浮点值。刚好float转换成double则隐式转换就可实现,而double转换到float则需要强制转换,就是显示转换。

而double类型的值范围大于float类型的值范围,所以float转double可以隐式转换,double转float却需要显示转换。

由此得出如下结论:

  当被转换类型的值范围小于目标类型的值范围时可以执行隐式转换,否则隐式转换是编译器会报异常。也就是说大存储容量的数据类型可以容纳小存储容量的数据类型,反之则不行。

那么隐式转换要具备的条件是:

1. 被转换类型的值范围必须包含目标类型的值范围;

2. 被转换类型的值必须与目标类型兼容。

而显示转换要被的条件则是:

1. 被转换类型的值要在目标类型的值范围之类,如果超出目标类型的最大或最小值,则编译器会抛出异常,转换不成功。

2. 被转换类型的值同样必须与目标类型互相兼容。

同样,隐式转换与显示转换在引用类型中同样适用。下面定义了两个类。

    /// <summary>
/// 人类
/// </summary>
public class Persion
{
public int Id { get; set; }
public int Sex { get; set; }
public int Age { get; set; }
public int Height { get; set; }
} /// <summary>
/// 程序类
/// </summary>
public class Programmer : Persion
{
public string Job { get; set; }
public string Postion { get; set; }
}

以上两个类的字段随意定义,可能不合理,在此只是说明其转换的问题。

然后做如下初始化和转换:

            Programmer pm1 = new Programmer() { Id = , Age = , Height = , Job = "程序员", Sex =  };
Persion p1 = pm1;

编译以后,显示编译通过:

再看另一段代码:

            Persion p2 = new Persion() { Id = , Age = , Sex = , Height =  };
Programmer pm2 = p2;

在编译,结果显示异常:

 因此,在引用类型中,比如类与类之间的转换,同样都需要遵循隐式转换与显示转换的原理和规则。

当然,有转换就必有数据损失,这是无法避免的,只能说开发人员在使用这些数据类型转换的时候要能够明白可能会造成什么样的损失,以及以怎样最合理的方式使用它们,才能在使用过程中造成不必要的损失。

C#之隐式与显示类型转换的更多相关文章

  1. C#的隐式和显示类型转换

    原文地址:http://blog.csdn.net/yysyangyangyangshan/article/details/7494577 关于隐式转换和显示转换,每种语言都有的,C#中当然也不例外. ...

  2. C# interface 的隐式与显示实现及适应范围源码演示

    把代码过程中经常用到的一些代码段做个记录,如下的资料是关于C# interface 的隐式与显示实现及适应范围演示的代码. interface IAnimal { void Dog(); } clas ...

  3. 从头认识java-13.9 隐式和显示的创建类型实例

    对于上一章节擦除引起的问题与解决的方法有读者提出过于简单.这里解释一下:由于笔者本身也遇不到对应的问题.仅仅是凭空想像一些有可能的问题,基于水平有限,因此上一章节写的比較简单,欢迎广大读者踊跃提意见, ...

  4. C# 使用隐式或显示实现接口的区别

    通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下:      interface IA ...

  5. C# 接口的隐式与显示实现【转】

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习.通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的 ...

  6. C# 接口的隐式与显示实现及适应场景

    通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:“隐式接口实现”.废话不说,例子如下: interface IAnimal { void Dog(); } cla ...

  7. C# 接口的隐式与显示实现说明

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使 ...

  8. C# 接口的隐式与显示实现

    隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问,显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用 一般来讲显式实现 ...

  9. 隐式意图&显示意图

    1 隐式意图     通过指定一组动作或者数据 开启activity   2 显示意图    通过指定具体包名和类名 开启activity       总结    (1)显示意图更加安全一些    ( ...

随机推荐

  1. Spring Security Filter详解

    Spring Security Filter详解 汇总 Filter 作用 DelegatingFilterProxy Spring Security基于这个Filter建立拦截机制 Abstract ...

  2. Bootstrap提示信息(标签、徽章、巨幕和页头)

    前面的话 在Bootstrap中,有一些组件用于提示信息,如 标签.徽章.巨幕和页头.本文将详细介绍Bootstrap提示信息 标签 在一些Web页面中常常会添加一个标签用来告诉用户一些额外的信息,比 ...

  3. 妙用Outlook2003群发商业邮件

    妙用Outlook2003群发商业邮件   我们知道,如果需要在Outlook 2003中向多个对象发送邮件,那么只需要在指定收件人时用分号输入多个邮件地址或者使用抄送方式即可:假如对象较多,可以使用 ...

  4. VB6之CRC32

    翻译篇:http://www.cnblogs.com/duzouzhe/archive/2009/08/05/1539543.html Private Declare Function GetTick ...

  5. Java编程练习(四)——集合框架应用

    Java集合框架小应用之扑克牌小游戏 学习了Java集合框架之后,我写了一个扑克牌小游戏来巩固知识.学习之余的练习之作,有不足之处还得多多指教了~(*/ω\*) 扑克牌小游戏背景: 1. 创建一副扑克 ...

  6. 使用C#创建SQLite桌面应用程序

    本文属于原创,转载请注明出处,谢谢! 一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 ...

  7. CSS 回流(reflow)

    摘录: 1. 回流 回流是指浏览器为了重新渲染部分或者全部的文档而重新计算文档中元素的位置和几何构造的过程.    因为回流可能导致整个dom树的重新构造,所以会影响性能. 2. display:no ...

  8. [CF373C]计算袋鼠是愉快的(Counting Kangaroos is Fun)-贪心

    Problem 计算袋鼠是愉快的 题目大意 有n只袋鼠,如果一个袋鼠体积是另一个袋鼠的两倍或以上,则小袋鼠能被大袋鼠装进袋子里,装进去后就看不到袋子里的袋鼠了,问这群袋鼠如何行动才能使得它们看着数量最 ...

  9. MySQL oracle 分页

    (1)MySql的Limit m,n语句 Limit后的两个参数中,参数m是起始下标,它从0开始:参数n是返回的记录数.我们需要分页的话指定这两个值即可. 比如:查询10行记录,起始行从3开始 SEL ...

  10. ThinkPHP 实现验证码渲染、校验、点击刷新

    一.在控制器中写方法,生成验证码,代码如下: /** * 验证码生成 * expire 验证码的有效期(秒) * useImgBg 是否使用背景图片 默认为false * fontSize 验证码字体 ...