1、类型间的强制转换和隐式转换;2、checked的使用初试;
3、C#要求把类型强制转换的定义放在源类(或结构)或者目标类(或结构)的内部,它的副作用是不能定义两个类之间的类型强制转换,除非至少可以编辑其中一个累的源代码,这是因为这样可以防止第三方吧类型强制转换引入类中。
a.内部定义了类型强制转换,就不能在另一个类中定义相同的类型强制转换;
b.显然,对于每一种转换只能有一种类型签字转换,否则编译器就不知道该选择哪个类强制转换了。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using static System.Console; 7 8 namespace LearnForCSharp 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 try 15 { 16 Currency balance = new Currency(50, 35); 17 18 WriteLine(balance); 19 WriteLine(balance.ToString()); 20 21 float balance2 = balance; 22 23 WriteLine(balance2); 24 25 checked 26 { 27 Currency balance3 = (Currency)balance2; 28 29 WriteLine(balance3.ToString()); 30 WriteLine(balance3); 31 } 32 33 checked 34 { 35 Currency balance3 = (Currency)(-50.50); 36 37 WriteLine(balance3.ToString()); 38 WriteLine(balance3); 39 } 40 } 41 catch (Exception e) 42 { 43 WriteLine("Exception occurred:" + e.Message); 44 } 45 46 ReadKey(); 47 } 48 } 49 50 struct Currency 51 { 52 public uint Dollars; 53 public ushort Cents; 54 55 public Currency(uint dollars, ushort cents) 56 { 57 this.Dollars = dollars; 58 this.Cents = cents; 59 } 60 61 public Currency(Currency c) 62 { 63 this.Dollars = c.Dollars; 64 this.Cents = c.Cents; 65 } 66 67 public override string ToString() 68 { 69 return string.Format("${0}.{1,-2:00}", Dollars, Cents); 70 } 71 72 public static implicit operator float(Currency value) 73 { 74 return value.Dollars + (value.Cents / 100.0f); 75 } 76 77 public static explicit operator Currency(float value) 78 { 79 //确保类型强制转换本身也在checked环境下 80 checked 81 { 82 uint dollars = (uint)value; 83 //强制转换导致的精度丢失 84 //ushort cents = (ushort)((value - dollars) * 100); 85 ushort cents = Convert.ToUInt16((value - dollars) * 100); 86 87 return new Currency(dollars, cents); 88 } 89 } 90 } 91 }
转载于:https://www.cnblogs.com/RedCoffeeGod/p/5678999.html