operator、explicit与implicit
说这个之前先说下什么叫隐式转换和显示转换
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 = 3 };Person p2 = new Person() { Age = 3 };Console.WriteLine(p1 == p2); //输出Trueint i = p1;Console.WriteLine(i); //输出3 Person p3 = (Person)4;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 };}}
转载于:https://www.cnblogs.com/MrZivChu/p/operator.html
operator、explicit与implicit相关推荐
- .net转换关键字:operator、explicit与implicit
operator.explicit与implicit 很少用到,但也不能不知道,发现这篇写很好,转一篇 operator operator 关键字用于在类或结构声明中声明运算符.运算符声明可以采用下列 ...
- AAC Explicit or Implicit SBR PS issue
最近在做AAC V1/V2 decoder时, 有客户要支持 Explicit or Implicit SBR & PS, such as VOT = 2, VOT = 5, 能很好的支持SB ...
- [翻译] TensorRT 中的 Explicit 与 Implicit Batch
本文翻译自 Explicit Versus Implicit Batch 原文地址: https://docs.nvidia.com/deeplearning/tensorrt/developer-g ...
- C++学习(八十四)explicit和implicit
在编程过程中, 我们习惯上使用explicit或者implicit关键字实现构造函数的显式或者隐式显示. explicit关键字:只能修饰只有一个参数的构造函数,或者有多个参数,但是除第一个参数外其他 ...
- C++explicit与implicit
C++explicit与implicit explicit与implicit是C++关键字,其用处是修饰类构造函数. explicit只能用于修饰只有一个参数的类构造函数,它的作用是表示此类构造函数是 ...
- 不忘本~explicit和implicit修饰符
返回目录 部分内容来自MSDN implicit 关键字用于声明隐式的用户定义类型转换运算符.如果转换过程可以确保不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. 1 cl ...
- C#中的Explicit和Implicit了解一下吧
今天在研究公司项目框架的时候看到了下面的用法,public static implicit operator JsonData(int data);.貌似很久没用过这种隐式转换的写法了,因此重新温习一 ...
- C# Explicit 和 Implicit
Implicit 关键字告诉编译器只有为了生成代码来调用方法,不需要在源代码中显示调用类型转换方法: Explicit 只有在显示转换时,才会调用方法: public sealed class Rat ...
- C++ explicit和implicit
一.类类型转换 首先,明确什么是类类型转换, 内置类型存在定义了几种自动转换的规则,同样地,类也有定义隐式的转换规则. 若构造函数没有声明explicit且只接受一个实参,则它可以进行隐式的类类型转换 ...
最新文章
- FSMO角色的Windows界面查看和转移示例
- Linux—帐号和权限管理
- Spring.net 模块组成
- php 安装redis php扩展
- Spark性能优化 -- Spark SQL、DataFrame、Dataset
- 高效率学习Java编程提升自我
- java rmi 使用管道_使用Java RMI时要记住的两件事
- bat java 启动脚本_bat批处理启动java程序通用脚本
- Jsoup使用DOM方法来遍历一个文档
- 关于 Linux 的配置文件 /etc/profile 路径出错后相关的命令失效解决方式(如:ls,vi不能用)...
- java之tomcat搭建文件服务器
- 基于python人脸识别考勤系统(语音播报)
- Java 正则表达式之提取数字
- SATA电源线的作用
- PathInfo模式的支持
- MySQL数据库day01
- 什么叫创建oracle实例,请问建立数据库实例是什么意思
- 微信消息推送消息加解密(golang)
- 关于mysql的判断题_数据库选择题和判断题
- 第二届电气、机械与计算机工程国际学术会议(ICEMCE2018)简单记录
热门文章
- html表格线条不显示,css display:表格不显示边框
- 生成osm文件_超酷城市肌理!地理数据信息爬取方法大全(B篇)DEM+POI+OSM
- c++ 10.跳转语句
- 学习笔记(01):英特尔® OpenVINO™工具套件初级课程-如何加速视频处理进程?
- 二叉树的基本操作及哈夫曼编码/译码系统的实现
- mysql数据库自动重新连接_mysql数据库自动重新连接
- 学习记录1-python图片分割transforms方法
- 可执行文件组成及内存映射
- centos7编译安装php7.3
- 从排序数组中删除重复项