当从小容器倒入大容器时,不会有任何损失,编译器会自动帮你完成。这叫安全转换。
口诀:小变大,自动挂。
int smallCup = 10;
long bigBucket = smallCup; // 自动把 int 转为 long,毫无压力
当要把大容器的水倒入小杯子时,可能会溢出(数据丢失)。编译器不敢自作主张,必须你强制下令。
口诀:大变小,强制搞。
double preciseValue = 3.14159;
int roughValue = (int)preciseValue; // 强制转换!小数部分 .14159 会被无情砍掉
// 结果 roughValue 变成了 3
有时候,数据类型完全不同(比如把字符串 "123" 变成数字 123),这时候光靠强转是不行的,得用工具。
Convert.ToInt32(): 变成整数Convert.ToString(): 变成字符串int.Parse(): 尝试解析字符串
using System;
namespace TypeConversion
{
class Program
{
static void Main(string[] args)
{
// 1. 隐式转换
int myInt = 10;
double myDouble = myInt; // 自动变成 10.0
Console.WriteLine(myDouble);
// 2. 显式转换 (强制)
double myMoney = 99.99;
int myCash = (int)myMoney; // 变成了 99,亏了 0.99
Console.WriteLine(myCash);
// 3. 字符串转换
string strEnergy = "100";
int energy = int.Parse(strEnergy); // 字符串变成了数字
Console.WriteLine("当前内力:" + (energy + 50)); // 输出 150
}
}
}
FormatException 会教你做人!
int.TryParse(),这招比较稳,失败了也不会报错,只会返回 false。
编写一个程序:
string s = "500";byte 类型(注意 byte 最大只能存 255)。
string s = "500";
int i = int.Parse(s);
byte b = (byte)i; // 灾难发生了!
Console.WriteLine(b);
结果: 输出可能是 244(因为 500 溢出了,发生了数据截断)。这叫溢出攻击!