在类型转换时常会遇到隐式转换和显式转换。那我们自己定义的类型要怎样去定义隐式转换和显式转换?我们来看一段代码

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转换的更多相关文章

  1. C# 自己定义 implicit和explicit转换

    explicit 和 implicit 属于转换运算符,如用这两者能够让我们自己定义的类型支持相互交换explicti 表示显式转换.如从 A -> B 必须进行强制类型转换(B = (B)A) ...

  2. C++雾中风景5:Explicit's better than implicit.聊聊Explicit.

    关于Explicit还是Implicit一直是编程语言中能让程序员们干起架的争议.那些聪明的老鸟总是觉得Implicit的规则让他们能够一目十行,减少样板代码的羁绊.而很多时候,Implicit的很多 ...

  3. 【转】C#中的implicit 和 explicit

    The implicit and explicit keywords in C# are used when declaring conversion operators. Let's say tha ...

  4. Scala中的Implicit(隐式转换,隐式参数,隐式类)

    文章来自:http://www.cnblogs.com/hark0623/p/4196452.html  转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...

  5. implicit和 explicit关键字

    implicit 关键字用于声明隐式的用户定义类型转换运算符. 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. class Digit { publi ...

  6. Implicit and Explicit Multithreading MULTITHREADING AND CHIP MULTIPROCESSORS

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION The concept of thread ...

  7. implicit和explicit的基本使用

    class MyAge { public int Age { get; set; } public static implicit operator MyAge(int age) { return n ...

  8. 操作符(运算符)重载 或者叫 二元运算符 operator + 与 转换式操作符 implicit operator explicit operator

    static void Main(string[] args) { rational r1 = new rational(5); rational r2 = new rational(51); rat ...

  9. C#自定义转换(implicit 或 explicit)

    C#的类型转换分为显式转换和隐式转换,显式转换需要自己声明转换类型,而隐式转换由编译器自动完成,无需我们声明,如: //long需要显式转换成int long l = 1L; int i = (int ...

随机推荐

  1. Linux下基于Erlang的高并发TCP连接压力实验

    1.实验环境: 联想小型机: 操作系统:RedHat Enterprise LinuxServer release6.4(Santiago) 内核版本号:Linux server1 2.6.32-35 ...

  2. BZOJ 3585: mex( 离线 + 线段树 )

    离线, 询问排序. 先处理出1~i的答案, 这样可以回答左端点为1的询问.完成后就用seq(1)将1到它下一次出现的位置前更新. 不断这样转移就OK了 ------------------------ ...

  3. CSDN高校俱乐部2013年秋季北京地区第一站“编程语言的应用及其发展”—北京联合大学

    2013年12月11日晚17:00.CSDN高校俱乐2013年秋季北京地区第一站“编程语言的应用及其发展”在北京联合大学进行. 首先,CSDN总部人员介绍CSDN俱乐部的改版以及线上编程挑战赛.CSD ...

  4. Windows Azure入门教学系列 (七):使用REST API访问Storage Service

    本文是Windows Azure入门教学的第七篇文章. 本文将会介绍如何使用REST API来直接访问Storage Service. 在前三篇教学中,我们已经学习了使用Windows Azure S ...

  5. Winfrom 文本框回车进入下一个个单元格(TextBox)

    1.重写方法 OnShown protected override void OnShown(EventArgs e) { base.OnShown(e); foreach (Control ct i ...

  6. python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客

    python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客     python datetime模块strptime/strptime form ...

  7. uvc摄像头代码解析6

    10.扫描视频设备链和注册视频设备 10.1 uvc视频链 struct uvc_video_chain { //uvc视频链 struct uvc_device *dev; //uvc设备 stru ...

  8. html5之拖放简单效果

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title> ...

  9. spring Jdbc自己主动获取主键。

    学习了下springjdbc,感觉挺有用的,相对来说springjdbc 扩展性相当好了 package com.power.dao; import java.lang.reflect.Paramet ...

  10. C++建立动态二维数组

    C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组                           int * ...