explicit 和 implicit 的用法

时间:2021-12-21 03:43:40

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; }
}
}