C#自定义转换(implicit 或 explicit)
C#的类型转换分为显式转换和隐式转换,显式转换需要自己声明转换类型,而隐式转换由编译器自动完成,无需我们声明,如:
//long需要显式转换成int
long l = 1L;
int i = (int)l; //int可以隐式的转换成long
int i = 1;
long l =;
我们还可以自定义显式转换和隐式转换,分别采用 explicit 和 implicit 关键字来实现,格式:
//显式转换
public static explicit operator Type_A(Type_B b)
{
return Instance_Of_Type_A;
}
//隐式转换
public static implicit operator Type_A(Type_B b)
{
return Instance_Of_Type_A;
}
其中 Type_A 和 Type_B 是不同的类型,且必须有一个类型是当前包含这个转换的类型,如:
public class ClassA
{
public string Description { get; set; } public static implicit operator ClassA(ClassB classB) => new ClassA() { Description = "implicit from ClassB to ClassA:" + classB.Description };
public static implicit operator ClassA(string description) => new ClassA() { Description = "implicit from string to ClassA:" + description };
public static implicit operator ClassB(ClassA classA) => new ClassB() { Description = "implicit from ClassA to ClassB:" + classA.Description };
public static implicit operator string(ClassA classA) => "implicit from ClassA to string:" + classA.Description; public override string ToString() => Description;
}
public class ClassB
{
public string Description { get; set; } public static explicit operator ClassB(string description) => new ClassB() { Description = "explicit from string to ClassB:" + description };
public static explicit operator string(ClassB classB) => "explicit from ClassB to string:" + classB.Description; public override string ToString() => Description;
}
static void Main(string[] args)
{
//隐式转换
{
ClassA classA = "string";//字符串隐式转换成ClassA
Console.WriteLine(classA as object); string description = new ClassA() { Description = "ClassA" };//ClassA隐式转换成字符串
Console.WriteLine(description); ClassA classA1 = new ClassB() { Description = "ClassB" };//ClassB隐式转换成ClassA
Console.WriteLine(classA1 as object); ClassB classB = new ClassA() { Description = "ClassA" };//ClassA隐式转换成ClassB
Console.WriteLine(classB as object); //输出:
//implicit from string to ClassA:string
//implicit from ClassA to string:ClassA
//implicit from ClassB to ClassA:ClassB
//implicit from ClassA to ClassB:ClassA
} //显式转换
{
ClassB classB = (ClassB)"string";//字符串显式转换成ClassB
Console.WriteLine(classB as object); string description = (string)new ClassB() { Description = "ClassB" };//ClassB显式转换成字符串
Console.WriteLine(description); //输出:
//explicit from string to ClassB:string
//explicit from ClassB to string:ClassB
}
}
注:自定义的转换在开发中不常见,在一些第三方包、插件、框架中比较常见,但是有一个需要注意的点:is 和 as 运算不受自定义类型转换的影响,如:
static void Main(string[] args)
{
//值类型int可以隐式转换成long,==判断为true,但是is判断为false
int i = 1;//int
long l = i;//int可以隐式转换为long
Console.WriteLine(l == i);//true
Console.WriteLine(i is long);//false ClassA classA = new ClassA() { Description = "ClassA" };
ClassB classB = classA;//ClassA隐式转换成ClassB
Console.WriteLine(classB as object);//implicit from ClassA to ClassB:ClassA
Console.WriteLine(classA is ClassB);//false
}
C#自定义转换(implicit 或 explicit)的更多相关文章
- 显示转换explicit和隐式转换implicit
用户自定义的显示转换和隐式转换 显式转换implicit关键字告诉编译器,在源代码中不必做显示的转型就可以产生调用转换操作符方法的代码. 隐式转换implicit关键字告诉编译器只有当源代码中指定了显 ...
- C++雾中风景5:Explicit's better than implicit.聊聊Explicit.
关于Explicit还是Implicit一直是编程语言中能让程序员们干起架的争议.那些聪明的老鸟总是觉得Implicit的规则让他们能够一目十行,减少样板代码的羁绊.而很多时候,Implicit的很多 ...
- 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换
[源码下载] 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换 作者:webabcd 介 ...
- 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换
介绍背水一战 Windows 10 之 绑定 DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件 UpdateSourceTr ...
- 【转】C#中的implicit 和 explicit
The implicit and explicit keywords in C# are used when declaring conversion operators. Let's say tha ...
- 5、flink常见函数使用及自定义转换函数
代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 一.flink编程方法 获取执行环境(execution environment) 加载/创建初始数据集 对 ...
- Spring自定义转换类,让@Value更方便
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 关于配置的文章已经写了很多,相信看过的人还是会有一定收获的,系列文章可阅读:南瓜慢说-配置相关文章.对于@Val ...
- C# 自己定义 implicit和explicit转换
explicit 和 implicit 属于转换运算符,如用这两者能够让我们自己定义的类型支持相互交换explicti 表示显式转换.如从 A -> B 必须进行强制类型转换(B = (B)A) ...
- C#之自己定义的implicit和explicit转换
在类型转换时常会遇到隐式转换和显式转换.那我们自己定义的类型要怎样去定义隐式转换和显式转换?我们来看一段代码 public class Rational { private Int32 _inner_ ...
随机推荐
- 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired
大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...
- ubantu上编辑windows程序
命令简记 cd $GOROOT/src cp -r $GOROOT /root/go1.4 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash 操作 ...
- 【编程思想】【设计模式】【结构模式Structural】组合模式composite
Python版 https://github.com/faif/python-patterns/blob/master/structural/composite.py #!/usr/bin/env p ...
- 单元测试(Jest 和 Mocha)
Vue CLI 拥有通过 Jest 或 Mocha 进行单元测试的内置选项. Jest 是功能最全的测试运行器.它所需的配置是最少的,默认安装了 JSDOM,内置断言且命令行的用户体验非常好.不过你需 ...
- Js和Thymeleaf如何获取model中的值
一.Jquery获取Model中的数据 1.将model中的值赋给hidden,然后Js获取隐藏域的值. 后台的实现: @RequestMapping("/QEditorMod1" ...
- 关于requests.exceptions.ConnectionError: HTTPSConnectionPool的问题
错误如下: raise ConnectionError(e, request=request)requests.exceptions.ConnectionError: HTTPSConnectionP ...
- $(document).ready()与window.onload的区别,站在三个维度回答问题
1.执行时机 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2 ...
- Sentry 监控 - 私有 Docker Compose 部署与故障排除详解
内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...
- Table.ReorderColumns移动…Reorder…(Power Query 之 M 语言)
数据源: 至少两列 目标: 列顺序重新排列 操作过程: 选取待移动的列>鼠标拖放列标题 选取待移动的列>[转换]>[移动]>选取 M公式: = Table.ReorderCo ...
- 判断存在…Contains…(Power Query 之 M 语言)
表函数 判断记录在表中是否存在 = Table.Contains( 表, 记录, {"指定列1",-, "指定列n"}) = Table.ContainsAll ...