前言

我们都知道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 吧,这样不会报错。

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

该系列继续更新。

最新文章

  1. JAVA - ATM机程序
  2. maven 的 pom.xml 文件报错:ArtifactTransferException: Failure to transfer
  3. 切取图片的一部分(利用CCRenderTexture)
  4. Android开发之Service的写法以及与Activity的通信
  5. Android开发之一些资源索引
  6. 【转】CString类型互转 int
  7. Android动态加载jar、apk的实现
  8. 安装ArcGIS License 10.1 许可管理器 破解版 服务启动又失败的解决办法
  9. AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖-转
  10. FZU 1894 志愿者选拔(优化循环)
  11. iOS 之 事件响应者链
  12. C# net request payload形式发送post请求
  13. 原生sql整理
  14. Andorid 翻书效果
  15. fleet中service之间的依赖关系
  16. c# 图片等比缩略
  17. SVN无法Cleanup
  18. DDD模式
  19. Spark Streaming实时处理应用
  20. poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

热门文章

  1. window.parent.postMessage 解决iframe父子页面域名不一样出现的跨域问题
  2. HttpClient请求接口实例demo
  3. 从redis中取出数据并转成java对象
  4. 【python】绘图坐标轴标题中包含上标或下标
  5. oracle修改表中的列
  6. jquery 判断字符串长度
  7. scottrade 手机应用中英文翻译
  8. 修改element-ui 面包屑的样式
  9. springboot默认的json配置
  10. Servlet执行步骤