C#中的Explicit和Implicit详情
作者:LamondLu 发布时间:2022-09-06 06:50:54
目录
一、Implicit和Explicit
1、Implicit
2、、Explicit
先上一段奇怪的代码:
if (dto.Payment == null) continue;
var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID);
dto.Payment = entity?.Payment;
其中dto.Payment
是一个PaymentDTO
类的实例,entity?.Payment
是一个Payment类的实例,PaymentDTO
类和Payment
类没有子父关系,所以不存在子类和父类之间的隐式转换。
奇怪的是Visual Studio
的编译器没有提示任何编译错误。
打开PaymentDTO
类的定义之后,发现了以下方法签名。
public static implicit operator PaymentDTO(Payment payment)
从方法签名上看,这就是重写PaymentDTO
类型的操作符,但并不是我以前常用的+,-,*,/, ==等。
查询MSDN
之后,才了解到implicit
和explicit是一对转换操作符。
一、Implicit和Explicit
1、Implicit
Implicit
关键字用于声明隐式的用户定义类型转换运算符。它可以实现2个不同类的隐式转换 ,提高代码的可读性。但是需要注意使用隐式转换操作符之后,在编译时会跳过异常检查,所以隐式转换运算符应当从不引发异常并且从不丢失信息,否则在运行时会出现一些意想不到的问题。
例如当前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();
}
}
2、、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();
}
}
来源:https://www.cnblogs.com/lwqlun/p/8082405.html


猜你喜欢
- 即刻点赞展示点赞的数字增加和减少并不是整个替换,而是差异化替换。再加上动画效果就看的很舒服。自己如何实现这种数字切换呢?下面用一张图来展示我
- 这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框架的时候。一、什么是泛型泛型是C#2.0推出的新语法,不是语法糖
- 1.一段简单的代码首先来一段代码,这个是单例模式,可能有的人不知道什么是单例模式,我就简单说一下单例模式是指一个类有且只有一种对象实例。这里
- 前言今天刷个题,遇到一个很有趣的问题,关于Comparator的使用,感觉也是一个关于写代码的一些小细节的问题关于ComparatorCom
- 本文总览本篇来学习Kotlin循环结构的知识1. While循环while循环用于重复迭代代码块,只要给定条件为 true就会执行一次循环代
- 程序员日常工作中,发送http请求特别常见。本文以Java为例,总结发送http请求的多种方式。1. HttpURLConnection使用
- Spring Data JPA 映射VO/DTO对象在项目开发中,时常需要根据业务需求来映射VO/DTO对象(这两个概念理解感觉很模糊- 。
- 一、需求:标题可能写的不够全部,下面来看下图片,大家就明白是什么意思了。视频与票的图标跟在标题后面显示,当标题过长时icon显示到省略号…后
- 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,
- 一、Code First 代码优先DbContext可以用于数据库优先,代码优先和模型优先的开发。DbContext主要包含一组非常易于使用
- 一、背景即使我电脑安装的JDK版本是8,然而在idea运行中常常提示xxjdk1.5已过时之类的,why?明明是我装的JDK8啊二、解决鼠标
- 众所周知springboot项目,使用springboot插件打包的话,会打包成一个包含依赖的可执行jar,非常方便。只要有java运行环境
- 如果想实现一个在桌面显示的悬浮窗,用Dialog、PopupWindow、Toast等已经不能实现了,他们基本都是在Activity之上显示
- 本文实例为大家分享了Android实现滑动效果的具体代码,供大家参考,具体内容如下坐标系与视图坐标系相辅相成1、坐标系:描述了View在屏幕
- 前言一直对它们之间的关系感到好奇,SpringBoot既然是Spring的封装,那么SpringBoot在初始化时应该也会有Bean的加载,
- Spring @Async无法实现异步问题原因项目中存在2个配置文件:springMVC.xml和beanDefines.xml,它们都配置
- 前言通过adb shell input可以模拟android各种输入事件,比如文字、按键、触摸等等。adb shell inputUsage
- 大家可以自行百度下阿里分布式事务,在这里我就不啰嗦了。下面是阿里分布式事务开源框架的一些资料,本文是springboot+dubbo+fes
- 前言:有时候我们在用Spring Aop面向切面编程,需要获取连接点(JoinPoint)方法参数名、参数值。环境:Mac OSXIntel
- 本文实例为大家分享了安卓实现单行多列横向滚动,供大家参考,具体内容如下<GridLayout android:layou