说这个之前先说下什么叫隐式转换显示转换

1、所谓隐式转换,就是系统默认的转换,其本质是小存储容量数据类型自动转换为大存储容量数据类型。

例如:float f = 1.0; double d=f;这样就是把float类型的f隐式转换成double类型了!但其实系统帮我们做了类似如下的工作:

float f = 1.0; double d=(double)f;

对于表示数值的基本数据类型来说,数值范围小的数据类型转换成数值范围大的数据类型可以进行隐式转换,而反过来则必须进行显示转换

2、显式类型转换,即强制类型转换。与隐式转换相反,而且强制转换会造成数据丢失。

例如:double d = 1.456; float f=(float)d;

只要强制指出转换成什么类型,就表示是显示转换

class Person:Animal{}

Person p=(Person)Animal; //显示转换

Animal a=p; //隐式转换

对于类类型来说,子类转换成父类可以进行隐式转换,而反过来则必须进行显式转换,如果两个类之间没有继承关系,则不能进行隐式转换或显式转换,此时必须在被转换的类中定义一个隐式转换(implicit)方法或显式转换(explicit)方法。

基本上是没有转换表达式的转换都是隐式转换,比如double a = 1 ;

而int类型显示转换成double显示转换就带有显示的(double)转换类型doubl a=(double)1;

隐式转换、显式转换是由对象兼容性而来的。兼容性包含两个方面,一个是它们之间具有继承或实现接口的关系。比如A继承自B,那么B有的东西A肯定有;A实现了B接口,那B规定的东西A肯定都有。这时候,A都可以隐式转换为B,因为B有的A肯定都有,这是必然的。如果一个对象类型为B,那么则不可以隐式转换为A,因为A有的东西B不一定有;但如果你知道这个类型为B的东西一定是A,那么就可以用显式转来来转换对象类型。另一种转换则是由对象规定的运算符,对象可以规定自己的显式或隐式运算符,将自己同另外一种对象间相互转换,这是通过运算符重载实现的(也就是接下来要讲的explicit(显示转换)implicit(隐式转换),不怎么常用)。而Parse方法则是对象自带的方法,你可以看作是和上面的运算符显式转换相同作用的,不过它是通过定义一个静态方法来实现转换。Convert也是这个用处,但是它做的工作比Parse方法一般要多,因此兼容性更好,但是速度也就会稍慢一些。

operator、explicit与implicit

operator 关键字用来重载内置运算符

    class Program
{
static void Main(string[] args)
{
Person p1 = new Person() { Age = };
Person p2 = new Person() { Age = };
Console.WriteLine(p1 == p2); //输出True int i = p1;
Console.WriteLine(i); //输出3 Person p3 = (Person);
Console.WriteLine(p3.Age); //输出4 Person p4 = p1 + p2;
Console.WriteLine(p4.Age);//输出6 Console.ReadKey();
}
} public class Person
{
public int Age { get; set; } public static bool operator ==(Person p1, Person p2)
{
return p1.Age == p2.Age;
} public static bool operator !=(Person p1, Person p2)
{
return p1.Age != p2.Age;
} public static Person operator +(Person p1, Person p2)
{
return new Person() { Age = p1.Age + p2.Age };
} /*
* 作用:是把Person类型隐式转换成int类型
* 使用显示转换也是可以的
*/
public static implicit operator int(Person p)
{
return p.Age;
} /*
* 作用:是把int类型显式转换成Person类型
* 使用隐示转换则会报错,指定显示转换则必须用显示转换,不可以用隐式转换
*/
public static explicit operator Person(int i)
{
return new Person() { Age = i };
}
}

最新文章

  1. Visual Studio中创建混合移动应用程序解决方案Xamarin Portable Razor
  2. .Net生成HTML的三种方法
  3. jquery动态创建节点
  4. 跟我一起Django - 01 安装和初始化
  5. foxmail创建163公司企业邮箱的时候会出现ERR Unable to log on
  6. 转自 void- man 差分约束系统详解
  7. session原理解析
  8. Visual Prolog 的 Web 专家系统 (7)
  9. HDU 4778 内存搜索&如压力
  10. Java实现 Base64、MD5、MAC、HMAC加密(转)
  11. hdu 4915 Parenthese sequence(模拟)2014多培训学校5现场
  12. 打造属于自己的支持版本迭代的Asp.Net Web Api Route
  13. HBase案例:HBase 在人工智能场景的使用
  14. 检测web界面不能访问后重启
  15. 二.django项目环境搭建
  16. 微信、qq二次分享
  17. vux环境配置
  18. jquery中$.post()方法的简单实例
  19. kubernetes集群搭建(7):常见问题及处理
  20. 理解ES7中的async/await

热门文章

  1. MMU CPU及思想
  2. 【CCPC-Wannafly Winter Camp Day4 (Div1) J】跑跑跑路(爬山)
  3. python 造轮子(一)——序列与字典
  4. set方法的使用
  5. 2018.8.2 Juint测试介绍及其命名的规范
  6. css3之Media Queries 媒体查询
  7. 剑指offer54 表示数值的字符串
  8. Linux内存管理 —— 内核态和用户态的内存分配方式
  9. HTML5<fieldset>标签
  10. 初尝微信小程序2-基本框架