C#类型的强制转换及隐式转换

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 }

 

posted @ 2016-07-17 17:23  cyh5272  阅读(1623)  评论(0)    收藏  举报