文章目录

  • implicit 隐式类型转换
  • Explicit 显式类型转换
  • 总结

implicit 隐式类型转换

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

使用隐式转换操作符之后,在编译时会跳过异常检查,所以隐式转换运算符应当从不引发异常并且从不丢失信息,否则在运行时会出现一些意想不到的问题。

例如当前PaymentDTO和Payment的定义如下

public class Payment
{public decimal Amount { get; set; }
}public class PaymentDTO
{public string AmountString { get; set; }
}

如果需要将Payment隐式转换成PaymentDTO, 仅需声明PaymentDTO的隐式转换运算符

public class PaymentDTO
{public string AmountString { get; set; }public static implicit operator PaymentDTO(Payment payment){return new PaymentDTO{AmountString = payment.Amount.ToString("C2")};}
}

调用时只需要直接赋值就可以

class Program
{static void Main(string[] args){PaymentDTO dto = new Payment { Amount = 1 };Console.WriteLine(dto.AmountString);Console.Read();}
}

Explicit 显式类型转换

Explicit关键字声明必须通过转换来调用的用户定义的类型转换运算符。不同于隐式转换,显式转换运算符必须通过转换的方式来调用,如果缺少了显式的转换,在编译时就会产生错误。

例如现在我们将前面PaymentDTO类中定义的转换操作符从Implicit变为Explicit

public class PaymentDTO
{public string AmountString { get; set; }public static explicit operator PaymentDTO(Payment payment){return new PaymentDTO{AmountString = payment.Amount.ToString("C2")};}}

这时候由于Main方法中没有显式转换,所以编译器出错,提示Cannot implicitly convert type ‘ExplicitImplicit.Payment’ to ‘ExplicitImplicit.PaymentDTO’. An explicit conversion exists (are you missing a cast?

如果想要编译器通过编译, 只需要做一个显示转换即可

class Program
{static void Main(string[] args){PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 };Console.WriteLine(dto.AmountString);Console.Read();}
}

总结

  • Implicit提高了代码的可读性,但程序员需要自己保证转换不引发异常且不丢失信息。
  • Explicit可阻止编译器静默调用可能产生意外后果的转换操作。
  • 前者更易于使用,后者能向阅读代码的每个人清楚地指示您要转换类型。

本文转载自:C#中的Explicit和Implicit,感谢分享。

更多内容请查看总目录【Unity】Unity学习笔记目录整理

【Unity】Unity C#基础(十五)implicit 隐式类型转换、explicit 显式类型转换相关推荐

  1. Python基础十五:面向对象编程四:高级特性

    Python基础十五:面向对象编程四:高级特性 Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程 Author:yooongchun Em ...

  2. 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

    壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,但开发好几年,依然被几道this指向题安排明明白白的人应该不在少数.对于初学者而言,this概念抽象,变化 ...

  3. Python网络爬虫Selenium页面等待:强制等待、隐式等待和显式等待

    关于Python网络爬虫Selenium强制等待.隐式等待和显式等待的总结 from selenium import webdriver import time from selenium.webdr ...

  4. js 中的this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

    壹 ❀ 引 工具猴-免费在线工具-在线工具箱- 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安 ...

  5. Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  6. Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  7. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

    intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...

  8. Neo4j:使隐式关系成为显式和双向关系

    最近,我阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示了Neo Technol ...

  9. oracle 游标内存自动释放,详解Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

最新文章

  1. c++作业5 9.22
  2. MAC电脑数据迁移方法
  3. Javascript模块化编程require.js的用法
  4. java递归算法实现
  5. 多项式相乘与相加演示
  6. 线程池的种类,区别和使用场景
  7. OpenGL中shader使用
  8. WordPress多用途电子商务博客新闻主题betheme 21.5.6版本
  9. UI设计实用临摹素材|APP设计的信息可视化!
  10. 树莓派命令行连接蓝牙音箱及不出声问题
  11. 财务人毕业三年薪资翻了三倍,学会数据分析竟然这么吃香
  12. jquery mysql jsp搜索功能_jquery实现的一个提前搜索功能
  13. JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器
  14. 关于@Autowired的使用:推荐使用构造函数进行注入
  15. 订单生产计划表范本_生产计划表(生产计划表格模板)
  16. 360浏览器的html在哪里,360浏览器收藏夹路径在哪里
  17. 服务器安装固态硬盘的步骤,电脑安装固态硬盘及安装系统的详细教程
  18. 一个优秀程序员可抵五个普通程序员!
  19. 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。 这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?2.角谷定理。
  20. Vue中引用图片动态背景图片

热门文章

  1. 蚂蚁课堂 - springboot入门(非常详细)讲解人:(余胜军)
  2. SecureCRT的命令行参数都有哪些
  3. jQuery弹出插件thickbox使用心得
  4. Differences between Theorem, Lemma and Corollary, etc.
  5. Android画不规则形状
  6. Mac宝藏软件推荐(笔者也在用)(二)
  7. 什么是Resnet50模型?
  8. Linux攻关之基础模块四 命令初识
  9. window系统node彻底卸载
  10. mac pdf去水印_PDF水印工具for Mac-PDF水印工具Mac版下载 V1.7-PC6苹果网