六、【C#】隐式转换

六、类型转换——隐式转换(C#)


提示:笔记中的内容是我自己的理解,可能会存在理解错误,也欢迎大家指正\( ̄︶ ̄*\))

1、隐式转换

隐式转换的基本规则:
(1)、不同类型之间可以进行自动转换。
(2)、大范围的数据类型去装载小范围的数据类型。

1.1 相同的大类型之间的转换

1.1.1 有符号的整型变量

1、有符号的整型变量:long、int、short、sbyte

举例:

long l = 1;
int i = 1;
short s = 1;
sbyte sb = 1;

l = i;  //正确!	隐式转换(int隐式转换成了long)(可以用大范围的类型去装载小范围的类型)

i = l;  //错误!	(不能够用小范围的类型去装载大范围的类型)
long l = 1;
int i = 1;
short s = 1;
sbyte sb = 1;

l = i;   //正确!	隐式转换(int隐式转换成了long)
l = s;   //正确!	隐式转换(short隐式转换成了long)
l = sb;  //正确!	隐式转换(sbyte隐式转换成了long)

i = s;   //正确!	隐式转换(short隐式转换成了int)
i = sb;  //正确!	隐式转换(sbyte隐式转换成了int)

s = sb;  //正确!	隐式转换(sbyte隐式转换成了short)

1.1.2 无符号的整型变量

1、无符号的整型变量:ulong、uint、ushort、byte

举例:

ulong ul = 1;
uint ui = 1;
ushort us = 1;
byte b = 1;

ul = ui;  //正确!	隐式转换(uint隐式转换成了ulong)
ul = us;  //正确!	隐式转换(ushort隐式转换成了ulong)
ul = b;   //正确!	隐式转换(byte隐式转换成了ulong)

ui = us;  //正确!	隐式转换(ushort隐式转换成了uint)
ui = b;   //正确!	隐式转换(byte隐式转换成了uint)

us = b;   //正确!	隐式转换(byte隐式转换成了ushort)

1.1.3 浮点数

1、浮点数:decimal、double、float

注意:double类型、float类型无法隐式转换为decimal类型。

举例:

decimal de = 1.1m;
double d = 1.1;
float f = 1.1f;

de = d;  //错误!(double类型、float类型无法隐式转换为decimal类型。)
de = f;  //错误!(double类型、float类型无法隐式转换为decimal类型。)
decimal de = 1.1m;
double d = 1.1;
float f = 1.1f;

d = f;  //正确!	隐式转换(float隐式转换成了double)

1.1.4 特殊类型

1、特殊类型:bool、char、string

注意:“特殊类型” 之间不存在隐式转换。


1.2 不同的大类型之间的转换

比如:“有符号的整型变量” 隐式转换 “无符号的整型变量”、“有符号的整型变量” 隐式转换 “浮点数”…


1.2.1 “有符号整型变量” 隐式转换为 “无符号整型变量”

注意:“有符号整型变量” 是不能隐式转换为 “无符号整型变量”。

原因:“有符号整型变量” 包括正数和负数,而 “无符号整型变量” 只包括正数,则 “有符号整型变量” 的范围要更大,并且隐式转换需要遵循 “大范围的数据类型去装载小范围的数据类型” 的原则。所以 “有符号整型变量” 就不能隐式转换为 “无符号整型变量”。


1.2.2 “无符号整型变量” 隐式转换为 “有符号整型变量”

注意:
1、在 “相同的数据类型” 的情况下,“无符号整型变量” 不能隐式转换为 “有符号整型变量” ,因为 “无符号整型变量” 的取值范围大于 “有符号整型变量”。
2、如果是 “不同的数据类型”,则能将 “无符号整型变量” 隐式转换为 “有符号整型变量”。

比如:“sbyte” 的取值范围为 “-128 ~ 127”,“byte” 的取值范围为 “0 ~ 255”,所以就不能将 “byte” 隐式转换为 “sbyte”。

举例:

//无符号整型变量
byte b2 = 1;
ushort us2 = 1;
uint ui2 = 1;
ulong ul2 = 1;

//有符号整型变量
sbyte sb2 = 1;
short s2 = 1;
int i2 = 1;
long l2 = 1;

i2 = ui2;  //错误!(在"相同的数据类型"的情况下,"无符号整型变量"是不能隐式转换为"有符号整型变量")

i2 = b2;  //正确!("byte"隐式转换成"int")

1.3 “整型” 隐式转换为 “浮点型”

注意
1:任何类型的整型(包括 “有符号” 和 “无符号”)都可以隐式转换为浮点型。
2:虽然double类型、float类型无法隐式转换为decimal类型。但是任何类型的整型(包括 “有符号” 和 “无符号”)都可以隐式转换为decimal。

举例:

//无符号整型变量
byte b2 = 1;
ushort us2 = 1;
uint ui2 = 1;
ulong ul2 = 1;

//有符号整型变量
sbyte sb2 = 1;
short s2 = 1;
int i2 = 1;
long l2 = 1;

//浮点数
float f2 = 1.1f;
double d2 = 1.1;
decimal de2 = 1.1m;

f2 = l2;  //正确!
f2 = i2;  //正确!
f2 = s2;  //正确!
f2 = sb2;  //正确!

f2 = ul2;  //正确!
f2 = ui2;  //正确!
f2 = us2;  //正确!
f2 = b2;  //正确!

d2 = l2;  //正确!

de = l2;  //正确!
de = ul2;  //正确!

1.4 “浮点型” 隐式转换为 “整型”

注意:“浮点型” 不能隐式转换为 “整型”。

原因:因为 “整型” 不能存储小数。所以在精度方面,“浮点型” 要高于 “整型”,那么也就可以说是 “浮点型” 的范围要大于 “整型”,所以根据 “大范围的数据类型去装载小范围的数据类型” 的原则,所以 “浮点型” 不能隐式转换为 “整型”。


1.5 特殊类型和其他类型之间的隐式转换

1.5.1 bool类型

1、任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“string类型”、“char类型” 都不能隐式转换为 “bool类型”。

2、“bool类型” 也不能隐式转换为任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“string类型”、“char类型”。


1.5.2 char类型

1、任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“string类型”、“bool类型” 都不能隐式转换为 “char类型”。

2、"char类型"可以隐式转换为 “int类型”、“uint类型”、“long类型”、“ulong类型”、“ushort类型”、“浮点型”。

3、“char类型” 隐式转换成数值类型(部分整型和浮点型)后,对应的数字其实是一个ASCII码。

问题:针对第二点的问题的原因?

原因:“char类型” 之所以能够隐式转换为部分整型和浮点型,是因为 “char类型” 是一个16位无符号整数,用于表示Unicode字符的编码值,取值范围是0 ~ 65535,所以它可以隐式转换为比它宽度更大的数值类型(“int类型”、“uint类型”、“long类型”、“ulong类型”、“ushort类型”)


1.5.3 string类型

1、任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”")、“浮点型”、“bool类型”、“char类型” 都不能隐式转换为 “string类型”。

2、"string类型"不能隐式转换为任何类型的整型(包括 “有符号的整型” 和 “无符号的整型”)、“浮点型”、“bool类型”、“char类型”。

  • 31
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值