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_ ...
随机推荐
- RestTemplate的exchange()方法,解决put和delete请求拿不到返回值的问题
嗷嗷待哺的controller(被调用provider的controller方法) //测试get少量参数 @RequestMapping(value = "detailsGetD" ...
- App内容分享
1.发送文本内容 发送简单的数据到其他应用,比如社交分分享的内容,意图允许用户快速而方便的共享信息. //分享简单的文本内容 public void btnShareText(View view) { ...
- 虚机扩大容量与vm减少所占容量
Linux的虚拟机碎片整理 sudo dd if=/dev/zero of=/free bs=1M sudo rm -f /free 镜像压缩 移动镜像 VBoxManage internalcomm ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(8. 安装和配置Kubernetes)
1. 概念 1.1. 比较主流的任务编排系统有mesos+marathon,swarm,openshift(红帽内部叫atom服务器)和最著名的kubernetes,居然说yarn也行,不过没见过谁用 ...
- 【Java 与数据库】How to Timeout JDBC Queries
How to Timeout JDBC Queries JDBC queries by default do not have any timeout, which means that a quer ...
- SpringMVC中@RestController和@Controller的区别
在使用SpringMVC时,对于Controller中的注解@RestController和@Controller需要我们区分清楚 @RestController注解相当于@ResponseBody和 ...
- 如何使用cURL获得请求/响应具体耗时?
如何使用cURL一次测量请求和响应时间? cURL支持格式化输出请求的详细信息(请参阅cURL手册页的-w.–write out<format>获取更多信息). 如题,我们将只关注如何知晓 ...
- 11、Redis的配置文件
Redis的配置文件 一.Redis配置文件简介 Redis是通过配置文件启动的 Redis对大小写字母不敏感 Redis基本上环境搭建都在配置文件 关于Redis配置文件位置是安装时放的位置,关于R ...
- 车载以太网第二弹|测试之实锤-TC8 TCP/IP协议一致性测试实践
前言 车载以太网测试实践系列,我们还分享了PMA测试实践.IOP测试实践 .本期给大家介绍的是TC8中的TCP/IP协议一致性测试(以下简称TCP/IP测试). TCP/IP测试-设备环境组成 TTw ...
- how2heap学习(一)
接下来的时间会通过how2heap学习堆的知识,这个系列可能会更新很多篇,因为每天学习到的东西要保证吸收消化,所以一天不会学习很多,但是又想每天记录一下.所以开个系列. first_fit 此题的源码 ...