5 - 类型转换

开始学习C#脚本语言,为Unity学习奠定基础。这次学习的是C#中类型转换有关隐式转换和显式转换的内容。

概念

类型转换就是变量在不同数据类型之间的相互转换,分为隐式和显式两种。

隐式转换

隐式转换就是不同类型之间的自动转换(大范围装小范围),我们无需考虑。

相同大类型之间的转换

对于一般的相同大类型间的隐式转换,只需遵循”大范围装小范围类型“的规则即可。例如有符号整数之间的转换:

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

// int -> long 的隐式转换, 用大范围装小范围类型
l = i;
// long -/> int, 不能用小范围类型装大范围类型
// i = l;

而有一些隐式转换有特例,例如浮点数之间的转换:

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

// decimal无法通过隐式转换存储double和float
// de = d;
// de = f;

对于之前提到的特殊类型(boolcharstring)则不存在隐式转换。

不同大类型之间的转换

首先看看有/无符号整数大类型之间的隐式转换:

// 有符号
sbyte sb = 1;
short s = 1;
int i = 1;
long l = 1;
// 无符号
byte b = 1;
ushort us = 1;
uint ui = 1;
ulong ul = 1;

// 无符号装有符号不能装, 因为有符号类型范围大
// b = sb;

// 有符号装无符号可以装, 但需要注意范围问题
// uint -/> int, uint正数范围比int大
// i = ui;
// byte -> int
i = b;

然后是浮点数和整数之间的隐式转换:

// 浮点数
decimal de = 1.1m;
double d = 1.1;
float f = 1.1f;

// 浮点数装整数: 浮点数可以装任何类型的整数
f = l;
f = ul;
de = l;
de = ul;

// 整数装浮点数: 
// 整数不能隐式存储浮点数, 浮点数范围比整数大

然后是特殊类型和其他类型的转换:

bool bo = true;
char ch = '1';
string str = "123";

// bool: 没有办法和其他类型相互隐式转换
// bo = i;

// char: 无法隐式存储其他类型变量
// ch = i;
// 但能被部分整型和浮点数存储(范围0~65535)
i = ch;
f = ch;

// string: 没有办法和其他类型相互隐式转换
// i = str;
// f = str;

总结

隐式转换的规则就是 高精度(大范围)装低精度(小范围)

  • double -> float -> 整数 -> char
  • decimal -> 整数 -> char
  • stringbool不参与隐式转换

显式转换

就是手动强制转换类型。

括号强转

例如强行让小范围的装大范围的数:

s = (short)i;

可能会出现范围问题造成的上/下溢出异常。并且boolstring类型也不能用括号强转。

使用Parse

可以使用变量类型.Parse("字符串")将字符串转换为对应类型的变量,前提是字符串是合法的(类型和范围均正确)。

int i = int.Parse("123");
bool b = bool.Parse("true");
char ch = char.Parse("A");

使用Convert

可以用Convert.To目标类型(变量/常量)更准确的进行显式转换,前提是变量/常量合法。

int a = Convert.ToInt32("123");

其他类型转string

只需用变量.ToString()即可:

string str = 123.ToString();
str = 'A'.ToString();
str = true.ToString();

参考资料

  • 【唐老狮】Unity基础课程之C#入门