explicit 和 implicit 的用法
explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换
explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A)
implicit 表示隐式转换,如从 B -> A 只需直接赋值(A = B)
隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用 implicit 运算符。不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用端
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace implicit_explicit { class Program { static void Main(string[] args) { TesImplicit t = new TesImplicit(); User u = new User() { Id = 1, Name = "lichaoqiang" }; Console.WriteLine("隐式转换-----------------------------------------------------------------"); Customer c = u; Console.WriteLine(c.CustomerId+"="+c.CustomerName); #region 2>显示转换 Customer customer = u; VIP v = (VIP)customer; Console.WriteLine("显示转换-----------------------------------------------------------------"); t.GetVIPInfo(v); #endregion Console.ReadLine(); } } /// <summary> /// test case /// </summary> public class TesImplicit { /// <summary> /// get the customer infomation /// </summary> /// <param name="customer"></param> public void GetCusterInfo(Customer customer) { Console.WriteLine("Customer:" + customer.CustomerName); } public void GetVIPInfo(VIP vip) { Console.WriteLine("VIP:" + vip.VName); } } /// <summary> /// /// </summary> public class User { /// <summary> /// /// </summary> public long Id { get; set; } /// <summary> /// /// </summary> public string Name { get; set; } /// <summary> /// 隐式转换 /// </summary> /// <param name="u"></param> /// <returns></returns> public static implicit operator Customer(User u) { return new Customer() { CustomerId = u.Id, CustomerName = u.Name }; } } /// <summary> /// /// </summary> public class Customer { /// <summary> /// /// </summary> public long CustomerId { get; set; } /// <summary> /// /// </summary> public string CustomerName { get; set; } /// <summary> /// 显示转换 /// </summary> /// <param name="c"></param> /// <returns></returns> public static explicit operator VIP(Customer c) { return new VIP() { VID = c.CustomerId, VName = c.CustomerName }; } } /// <summary> /// /// </summary> public class VIP { /// <summary> /// /// </summary> public long VID { get; set; } /// <summary> /// /// </summary> public string VName { get; set; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通