显式转换implicit关键字告诉编译器,在源代码中不必做显示的转型就可以产生调用转换操作符方法的代码.
隐式转换implicit关键字告诉编译器只有当源代码中指定了显示的转型时,才产生调用转换操作符方法的代码.
隐式转换可能在各种情况下发生,包括功能成员调用,表达式执行和赋值。
显式转换可以在强制类型转换表达式中发生。
用户定义的隐式转换应该被设计成不会抛出异常而且不会丢掉信息。
如果一个用户定义的转换将产生一个异常(例如因为源变量超出了范围)或丢掉信息(例如丢掉高位),那么这个转换应该被定义为一个显式转换。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 显示转换和隐式转换 8 { 9 public class Rectangle 10 { 11 public double Length { get; set; } 12 13 public double Width { get; set; } 14 15 /// <summary> 16 /// 重载隐式转换操作符 17 /// </summary> 18 /// <param name="v"></param> 19 public static implicit operator Rectangle(Square v) 20 { 21 var width = v.Width; 22 var length = v.Length; 23 var num = width > length ? length : width; 24 return new Rectangle() { Width = num, Length = num }; 25 } 26 } 27 28 public class Square 29 { 30 public double Length { get; set; } 31 32 public double Width { get; set; } 33 34 /// <summary> 35 /// 重载隐式转换操作符 36 /// </summary> 37 /// <param name="v"></param> 38 public static implicit operator Square(Rectangle v) 39 { 40 var width = v.Width; 41 var length = v.Length; 42 var num = width > length ? length : width; 43 return new Square() { Width = num, Length = num }; 44 } 45 } 46 47 internal class Program 48 { 49 public static void RectToSquaExplicit(Rectangle rect, Square squa) 50 { 51 rect = squa;//把长方形隐式转换为正方形 52 Console.WriteLine($"{rect.GetType()}");//类型不会被改变 53 54 Console.WriteLine($"{rect.Width},{rect.Length}"); 55 } 56 57 public static void RectToSquaImplicit(Rectangle rect, Square squa) 58 { 59 rect = squa;//把长方形隐式转换为正方形 60 Console.WriteLine($"{rect.GetType()}");//类型不会被改变 61 62 Console.WriteLine($"{rect.Width},{rect.Length}"); 63 } 64 72 73 private static void Main(string[] args) 74 { 75 var rect = new Rectangle() { Length = 100, Width = 75 }; 76 var squa = new Square() { Length = 50, Width = 50 }; 77 78 RectToSquaImplicit(rect, squa); 79 SquaToRectImplicit(squa, rect); 80 81 var r = (Rectangle)squa; 82 83 Console.WriteLine($"{r.GetType()}");//类型被改变 84 Console.WriteLine($"{r.Width}=={r.Length}"); 85 } 86 } 87 }