用户定义的数据类型转换

时间:2022-03-22 07:42:30

用户定义的数据类型转换

C#允许定义自己的 数据类型,这意味着需要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以说明怎么使用它.

C#允许用户进行两种定义的数据类型转换,显式和隐式,显式要求在代码中显式的标记转换,其方法是在原括号中写入目标数据类型.

对于预定义的数据类型,当数据类型转换时可能失败或者数据丢失,需要显示转换:

1.把int数值转换成short,因为short可能不够大,不能包含转换的数值.

2.把所有符号的数据转换为无符号的数据,如果有符号的变量包含一个负值,会得到不正确的结果.

3.把浮点数转换为整数数据类型时,数字的小数部分会丢失.

此时应在代码中进行显示数据类型转换,告诉编译器你知道这会有丢失数据的危险,因此编写代码时把这些可能考虑在内.

注意:如果源数据值使数据转换失败,或者可能会抛出异常,就应把数据类型转换定义为显式.

定义数据类型转换的语法有点类似于运算符重载.

例如:隐式类型转换的代码:

public static inplicit operator float(Current current)

{}

和运算符重载相同,数据类型转换必须声明为publicstatic.

注意:

当数据类型转换声明为隐式时,编译器可以显式或隐式的调用数据类型转换.

当数据类型转换声明为显式的,编译器只能显式的调用类型转换.

案例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 类型转换

{

class Program

{

static void Main(string[] args)

{

try

{

Current balance = new Current(50, 35);

Console.WriteLine(balance);

Console.WriteLine("balance using tostring() : + " + balance.ToString());

//隐式类型转换

float balance2 = balance;

Console.WriteLine("After converting to float : " + balance2);

//显示类型转换

balance = (Current)balance2;

Console.WriteLine("After converting to Current : " + balance);

float t = 45.63f;

Current c = (Current)t;

Console.WriteLine(c.ToString());

checked

{

balance = (Current)(-50.5);

Console.WriteLine("result is : " + balance.ToString());

}

}

catch (Exception)

{

Console.WriteLine("错误");                

}

Console.ReadKey();

}

}

struct Current

{

public uint Dollars;

public ushort Cents;

//构造函数

public Current(uint dollars, ushort cents)

{

this.Dollars = dollars;

this.Cents = cents;

}

//重写ToString()方法

public override string ToString()

{

return string.Format("{0}.{1,-2:00}", this.Dollars, this.Cents);

}

//隐式类型转换

public static implicit operator float(Current value)

{

return value.Dollars + (value.Cents / 100.0f);

}

//显示类型转换

public static explicit operator Current(float f)

{

uint dollars = (uint)f;

ushort cents = (ushort)((f - dollars) * 100);

return new Current(dollars, cents);

}

}

}

将设计两个问题:

1.从float转换为Current得到错误的结果50.34,而不是50.35,----圆整造成的,发生截断问题.