C#之自己定义的implicit和explicit转换
在类型转换时常会遇到隐式转换和显式转换。那我们自己定义的类型要怎样去定义隐式转换和显式转换?我们来看一段代码
public class Rational{private Int32 _inner_int = 0;public Rational(){}public Rational(Int32 num){this._inner_int = num;}public Int32 ToInt32() { return this._inner_int; }// Implicitly constructs and returns a Rational from an Int32 public static implicit operator Rational(Int32 num){return new Rational(num);}// Explicitly returns an Int32 from a Rational public static explicit operator Int32(Rational r){return r.ToInt32();}public override string ToString(){//return base.ToString();String s = String.Format("{0}", this._inner_int);return s;}}
測试代码
class Program{static void Main(string[] args){Rational r1 = 10; Console.WriteLine(r1); Int32 i = r1; Console.WriteLine(i); Console.ReadLine();}}
这时编辑会报错,见下图
从提示能够看到,是由于Int32 i=r1时缺少了显式转换。如今我们加入显示转换,改动后的代码及输出结果例如以下:
结果正常输出为10.
那为什么会这样呢?究其原因是在Rational转换成 Int32时,指定了explicit(显式的),所以必需要指定转换类型Int32。假设将explicit换成implicit(隐式),原来的代码将能够正常执行。
改动后的Rational
public class Rational{private Int32 _inner_int = 0;public Rational(){}public Rational(Int32 num){this._inner_int = num;}public Int32 ToInt32() { return this._inner_int; }// Implicitly constructs and returns a Rational from an Int32 public static implicit operator Rational(Int32 num){return new Rational(num);}// Explicitly returns an Int32 from a Rational public static <span style="color:#ff0000;">implicit</span> operator Int32(Rational r){return r.ToInt32();}public override string ToString(){//return base.ToString();String s = String.Format("{0}", this._inner_int);return s;}}
測试代码及输出结果
可见explicit和implicit影响着类型的显式转换和隐式转换。
事实上在Rational r1=10已经运行了隐式转换,相应的转换代码例如以下:
// Implicitly constructs and returns a Rational from an Int32 public static implicit operator Rational(Int32 num){return new Rational(num);}
假设将implicit换成explicit,Rational r1=10也将会报错(能够自行測试)。
转载请注明出处:http://blog.csdn.net/xxdddail/article/details/38057563
C#之自己定义的implicit和explicit转换相关推荐
- C# 自定义 implicit和explicit转换
explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换 explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A) ...
- 用implicit和explicit打通两种类型
我们知道,在c#中,如果两个类型没有继承关系 ,是不能相互值赋的,但有两个关键字implicit和explicit,可以让 Date date = DateTime.Now这样的赋值成为可能. 注:c ...
- 无法将类型int隐式转换为string_Scala implicit 隐式转换安全驾驶指南
这篇短文将结合实例对隐式转换的各种场景进行解释和总结,希望看完的人能够安全驶过隐式转换这个大坑. 隐式转换函数 隐式转换函数有两种作用场景. 1 转换为期望类型:就是指一旦编译器看到X,但需要Y,就会 ...
- implicit和explicit
implicit 关键字用于声明隐式的用户定义类型转换运算符. static implicit operator target_type { source_type identifier } 参数 t ...
- IEEE754标准以及非常规划定义,double的二进制转换工具类
IEEE754标准 今天我们要讨论的问题是在Java中:double pi = 3.14; 在内存中第10位上是0还是1? 这个问题需要我们了解Java中double类型在内存中是如何存储的. ...
- PCL学习(4.5)——点云对象的两种定义方式的区别与转换
创建与访问 第一种,是一种vector的赋值方式,将point数据push_back到pcl::PointXYZ类型的模板中. pcl::PointCloud<pcl::PointXYZ> ...
- C# 语言规范_版本5.0 (第10章 类)
1. 类 类是一种数据结构,它可以包含数据成员(常量和字段).函数成员(方法.属性.事件.索引器.运算符.实例构造函数.静态构造函数和析构函数)以及嵌套类型.类类型支持继承,继承是一种机制,它使派生类 ...
- operator、explicit与implicit
说这个之前先说下什么叫隐式转换和显示转换 1.所谓隐式转换,就是系统默认的转换,其本质是小存储容量数据类型自动转换为大存储容量数据类型. 例如:float f = 1.0: double d=f:这样 ...
- c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别...
msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library ...
最新文章
- linux 锁定重要文件 更改重要命令
- linux tar 参数 cvf xvf cvzf zxvf 区别
- Vmware Vsphere虚拟化技术:6.7新特性介绍
- ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
- ipython jupyter区别_ipython jupyter notebook中显示图像和数学公式实例
- NIOS II EDS NIOS II IDE 转载
- 【译】Input Method Manager (IMM):输入法管理器
- python处理pcap文件_[转载]Python读取pcap文件
- 怎样给div增加resize事件
- 关于路由器认证校园网的可行方案.md
- CactiEZ-优化操作
- android edge 去广告,edge浏览器怎么去广告? edge浏览器去广告插件adsafe的使用方法...
- 官方水晶报表 .NET 应用程序实例下载 (Visual Basic .NET)
- 出租分数 20作者 陈越单位 浙江大学
- Linux+MySQL+MyCat实现分库分表,通过MyCat数据库中间件实现分库分表配置实战
- JAVA中native方法(实现例子)
- 【Visual Studio Code】中文乱码问题
- android变身蓝牙键鼠,使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘
- 阿里校园招聘前端面试
- 【whistle】Whistle 安装及使用