前言

我们都知道operator 可以对我们的操作符进行重写,那么explicit 和 implicit 就是对转换的重写。

正文

explicit 就是强制转换,然后implicit 就是隐式转换。

static void Main(string[] args)
{
string a = string.Empty;
ConsumeValue consumeValue = new ConsumeValue();
consumeValue.Value = "测试数据";
a = consumeValue;
Console.WriteLine(a);
} public struct ConsumeValue
{ public string Value; public static implicit operator String(ConsumeValue consumeValue)
{
return consumeValue.Value;
}
}

比如说,自己定义了一个结构体,然后让结构体可以和string之间相互转换。

那么你也可以写 string 转换为 ConsumeValue的。

static void Main(string[] args)
{
string a = "测试数据";
ConsumeValue consumeValue = a;
Console.WriteLine(consumeValue.Value);
} public struct ConsumeValue
{ public string Value; public static implicit operator String(ConsumeValue consumeValue)
{
return consumeValue.Value;
} public static implicit operator ConsumeValue(string value)
{
ConsumeValue consumeValue = new ConsumeValue();
consumeValue.Value=value; return consumeValue;
}
}

出了隐式转换,还可以强制转换。

static void Main(string[] args)
{
string a = "测试数据";
ConsumeValue consumeValue = (ConsumeValue)a;
Console.WriteLine(consumeValue.Value);
} public struct ConsumeValue
{ public string Value; //public static implicit operator String(ConsumeValue consumeValue)
//{
// return consumeValue.Value;
//} //public static implicit operator ConsumeValue(string value)
//{
// ConsumeValue consumeValue = new ConsumeValue();
// consumeValue.Value=value; // return consumeValue;
//} public static explicit operator String(ConsumeValue consumeValue)
{
return consumeValue.Value;
} public static explicit operator ConsumeValue(string value)
{
ConsumeValue consumeValue = new ConsumeValue();
consumeValue.Value = value; return consumeValue;
}
}

强制转换就是需要在前面加上要转换的类型。

那么来看下这两者的原理。

隐式转换原理。

其实就是生成两个静态的方法。

然后调用。

所以隐式转换是安全的,就是我们调用方法一样。

那么看下强制转换的原理。

也是一样的。

这样我们就会存在一个疑问哈,那就是既然有隐式转换,自动帮我们验证,那么强制转换不是麻烦吗?

是的一般情况下,我们不用强制转换的,但是它有用武之地。

那就是传进来是一个object的时候。

static void Main(string[] args)
{
object a = new ConsumeValue();
ConsumeValue consumeValue = (ConsumeValue)a;
Console.WriteLine(consumeValue.Value);
}

你不知道其类型的时候,比如有马 和 羊,还有车,他们没有继承关系的时候,你希望给他们进行代理抽象,那么你传进来的可能就是一个object,那么这个时候自然就是强制转换了。

写个伪代码

chouxiang:
name
// 强制转换的方法 yang ma che
yang:
name
ma:
name
che:
name 方法:
string change(object a):
var c = (chouxiang)a

现在还是尽量用is 和 as 吧,这样不会报错。

用强制还是隐式一般看场景,一般情况下还是用隐式,写起来比较舒服一些。

该系列继续更新。

重学c#系列—— explicit、implicit与operator[三十四]的更多相关文章

  1. 重学c#系列——逆变和协变[二十四]

    前言 简单整理一下逆变和协变. 正文 什么是逆变和协变呢? 首先逆变和协变都是术语. 协变表示能够使用比原始指定的派生类型的派生程度更大的类型. 逆变表示能够使用比原始指定的派生类型的派生程度更小的类 ...

  2. 重学c#系列——委托和匿名函数[二十五]

    前言 简单介绍一下什么是委托. 正文 以前也写过委托,这次算是重新归档,和新的补充吧. https://www.cnblogs.com/aoximin/p/13940125.html 有些人说委托是函 ...

  3. 重学c#系列——订阅发布与事件[二十六]

    前言 简单介绍一下订阅发布与事件. 正文 先来看一下委托的订阅与发布. public delegate void TestDelegate(); public class Cat { public T ...

  4. 重学c#系列—— 反射的基本理解[三十三]

    前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...

  5. 重学c#系列—— 反射深入一点点[三十三]

    前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...

  6. 重学c#系列——字典(十一)

    前言 重学c#系列继续更新,简单看一下字典的源码. 看源码主要是解释一下江湖中的两个传言: 字典foreach 顺序是字典添加的顺序 字典删除元素后,字典顺序将会改变 正文 那么就从实例化开始看起,这 ...

  7. 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)

    1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...

  8. 重学c#系列——对c#粗浅的认识(一)

    前言 什么是c#呢? 首先你是如何读c#的呢?c sharp?或者c 井? 官方读法是:see sharp. 有没有发现开发多年,然后感觉名字不对. tip:为个人重新整理,如学习还是看官网,c# 文 ...

  9. 重学c#系列——linq(2) [二十八]

    前言 前文提及到了一些基础的linq的基础,那么这一节是一些补充. 正文 关于一个orderby的问题. 比如我们输入两个order by. 这里告诉我们多个order by是没有意义的,如果多个那么 ...

  10. 重学Golang系列(一): 深入理解 interface和reflect

    前言 interface(即接口),是Go语言中一个重要的概念和知识点,而功能强大的reflect正是基于interface.本文即是对Go语言中的interface和reflect基础概念和用法的一 ...

随机推荐

  1. C# 屏蔽词过滤

    参考:https://www.cnblogs.com/kubidemanong/p/10834993.html public class TreeNode { public char Char; pu ...

  2. 问题:配置apache的相关配置文件报错:Invalid command 'Order' (已解决)

    1. 问题描述 在虚拟文件httpd-vhosts.conf里面,directory里加入Order allow,deny,重启apache,出现Invalid command 'Order', pe ...

  3. noi 1.1 2 输出第二个整数

    描述 输入三个整数,把第二个输入的整数输出. 输入 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. 输出 只有一行,一个整数,即输入的第二个整数. 样例输入 123 456 7 ...

  4. Qt实现带有映射关系的进度条

    1.编写继承自widget的新类,这里我们定义为colorWidget; 2.在colorWidget中添加私有变量QVector<QRect> m_rects,用于存放进度条的不同区间( ...

  5. FPGA串口 波特率的计数器值

    开发板时钟为50Mhz, t为 20ns; xxx波特率时指每秒传xxx bit字节数据.也就是T=1/xxx; 再用T/t就可以得出波特率的计数周期了: 例如9600:T=1/96000=1.041 ...

  6. vue中关于get传参数为数组的解决方法

    按理来说,get请求方式是没有数组的,get请求方式带参数都是字符串,需要和后端协商是用某个标识符分割开,例如"|"   ",". 当然如果需要数组的话,也能解 ...

  7. C语言——使用循环和递归计算阶乘

    使用循环和递归计算阶乘: /*使用循环和递归计算阶乘*/ #include<stdio.h> double fact(int num);//函数声明,阶乘函数,用于循环时调用 double ...

  8. 在CentOS下安装nginx+php环境

    一.nginx 安装 1. 在nginx官网下载nginx源码 提供一个nginx官网下载地址: http://nginx.org/download/nginx-1.12.2.tar.gz 注意:请先 ...

  9. 第15章 授权:保护您的应用程序(ASP.NET Core in Action, 2nd Edition)

    本章包括 使用授权控制谁可以使用你的应用 对策略使用基于声明的授权 创建自定义策略以处理复杂的需求 根据所访问的资源授权请求 隐藏用户未经授权访问的Razor模板中的元素 在第14章中,我向您展示了如 ...

  10. arduino问题记录

    1.tx.rx只能写,不能读 2.Arduino中文社区