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 ...
随机推荐
- The service command supports only basic LSB actions (start, stop, restart, try-restart, reload,force-reload, status)
# service iptables save The service command supports only basic LSB actions (start, stop, restart, t ...
- 成绩累加排名,poj(2153)
题目链接:http://poj.org/problem?id=2153 解题报告: 注意map中的string,因此要将char[]转换为string型. #include <iostream& ...
- BFS变换素数,POJ(3126)
题目链接:http://poj.org/problem?id=3126 解题报告: #include <iostream> #include <queue> #include ...
- 2018.9.3 CEP课程总结
什么是CEP课程? 职业生涯规划课程 蓝桥介绍 立人达人 全人教育 人文 重视人 尊重人 关心人 爱护人 人才 人格 简历的制作 找工作的流程? 1.简历的准备------>投发简历(自己投.老 ...
- 关于 npm install 命令
使用 `npm install` 命令安装模块时 ,有以下几种形式: 安装模块到项目 node_modules 目录下,不会将模块依赖写入 dependencies 或 devDependencies ...
- Python -函数的参数定义
一.函数的参数有四种,位置参数.默认参数.可变参数和关键字参数 def func(x, y=0, *arg, **args): '''x为位置参数 y有默认值 *arg为可变参数 **args为关键字 ...
- RandomUserAgentMiddleware练习
# 请求头添加随机user-agent class RandomUserAgentMiddleware(object): def __init__(self, agents): self.agent ...
- C#继承简介与规则
一.C#继承简介 1. 类的层次结构 下面是一个类的层次结构图: 上图反映了鱼类的派生关系,其中最高层的实体往往具有最一般最普遍的特征,越下层的实体就越具体,并且下层包含了上层的特征.如果将上层的实体 ...
- MBProgressHUD 优雅地去提示
项目主页: MBProgressHUD 实例下载: 点击下载 快速上手: 当执行需要较长时间的任务时,使用MBProgressHUD最重要的一点是: 保证主线程是空闲的,这样可以使UI实时更新.因此: ...
- sqlite3基本操作
在移动设备上进行高性能高效率的大量数据存储,我们一般用得时sqlite这款轻巧型的数据库,这里介绍其增删改查基本功能 在ios开发中我们需要先导入"libsqlite3.dylib" ...