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 = };
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 };
}
}
operator、explicit与implicit的更多相关文章
- C#中转换运算符explicit、implicit、operator、volatile研究
C#中的这个几个关键字:explicit.implicit与operator,估计好多人的用不上,什么情况,这是什么?字面解释:explicit:清楚明白的;易于理解的;(说话)清晰的,明确的;直言的 ...
- explicit 和 implicit 的用法
explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换 explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A) ...
- C#的关键字Explicit 和 Implicit
一.explicit和implicit explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符:implicit 关键字用于声明隐式的用户自定义的类型转换运算符. 总结来说: ...
- 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合
[论文标题]CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Colla ...
- 操作符(运算符)重载 或者叫 二元运算符 operator + 与 转换式操作符 implicit operator explicit operator
static void Main(string[] args) { rational r1 = new rational(5); rational r2 = new rational(51); rat ...
- (二) operator、explicit与implicit 操作符重载
有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整 ...
- (一) operator、explicit与implicit 操作符重载
原文地址: Click Here 操作符重载必须用public static 应为操作符是用来操作实例的. operator operator ...
- 可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用
问题一:Nullable<T>可赋值为null 先看两行C#代码 int? i1 = null; int? i2 = new int?(); int? 即Nullable<int&g ...
- C# explicit与implicit
1.它们解决什么问题? 考虑下面的需求,Person类有个字段age.我想使用Person p = (Person) 18 来创建一个age为18的Person对象,怎么办? 更进一步,我想使用Per ...
随机推荐
- VPS一键测试脚本 / 自带结果导出
脚本命令 一下脚本可能卡住,运行时间长,建议在screen中运行. 1.秋水逸冰大佬的Bench.sh脚本 特点:用时较短,对系统测试全面,英文:但缺少国内节点测速 有趣的是,bench.sh既是脚本 ...
- Python IDE PyCharm的快捷键大全
Python IDE PyCharm的快捷键大全 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl ...
- python :编写装饰器
简单装饰器 def log_time(func): # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用 def make_decorater(): print('现在开始装饰') f ...
- maven简单了解,没有Maven和使用Maven的区别
Maven提供了开发人员构建一个完整的生命周期框架.开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期.Maven让开发人员的工作更轻松,同时创建报表,检查,构建和 ...
- angular2中一种换肤实现方案
思路:整体思路是准备多套不同主题的css样式.在anguar项目启动时,首先加载的index.html中先引入一套默认的样式.当我们页面有动作时再切换css. 可以通过url传参触发,也可以通过bu ...
- C#进阶学习笔记(个人整理)
学习笔记 第一章: 一.回顾数组 1.变量 : 只能存储一个数据 2.数组 :存储固定大小的相同类型的数据 3.对象 : 存储多个相同/不同类型的数据 4.集合 : 特殊的容器,存储N个相同/不同类型 ...
- 关于TP3.2框架读取Sql server中文字段数据以及处理乱码的一些小心得
最近要做一个项目,需要使用TP3.2框架,之前什么也不会,就硬着头皮上了,结果真的闹了挺多emmmmmm挺低级的错误,就像SQL Server中文字段的读取,一开始我是照着读取英文字段的格式来写的,在 ...
- [C#]常用开源项目
[转][C#]常用开源项目 本文来自:http://www.cnblogs.com/sunxuchu/p/6047589.html Json.NET http://www.newtonsoft.com ...
- 陌生又熟悉的数据库之ID增加
当我们设计一张表时,通常为了保证记录的唯一性,会为表增加一个ID字段,生成记录时ID自动加一
- 笔记-爬虫-js代码解析
笔记-爬虫-js代码解析 1. js代码解析 1.1. 前言 在爬取网站时经常会有js生成关键信息,而且js代码是混淆过的. 以瓜子二手车为例,直接请求https://www.guaz ...