1. 入门
你有没有试过把一个大西瓜塞进瓶子?C#每次你让它把一个类型的变量赋值给另一个类型时,其实也差不多。简单的时候就像把苹果放进行李箱(小变大),但有时候就得小心翼翼(西瓜进瓶子——不出事才怪)。
类型转换,就是把一个数据类型的值变成另一个类型。这经常用在你想把不同类型的值加起来、比较,或者传给只接受特定类型的方法时。
现实里程序员老遇到这事:比如你在做支付、算折扣、搞物理计算,或者解析用户键盘输入的数字(那都是字符串进来的)。
2. 隐式类型转换 (Implicit Conversion)
这是什么?
隐式转换就是C#自己帮你决定,哪些类型之间可以“无痛”搬运数据。全自动——你啥都不用写,直接用就行。
- 编译器不会报错。
- 不需要特殊命令或者cast。
- 不会丢数据(基本上都不会)。
隐式转换例子
int a = 42;
double b = a; // 隐式转换 int -> double
Console.WriteLine(b); // 42 (但现在是42.0)
这里a是int类型,赋值给b时自动变成double。不会丢数据,因为所有int的值都能装进double里。
这里a是int类型,赋值给b时自动变成double。不会丢数据,因为所有int的值都能装进double里。
什么时候能用?
- 当目标类型比源类型宽——支持更大范围的数据。
- 不会丢数据。
- 例子:
- int → long
- int → float / double
- float → double
- char → int
再来个例子:
byte x = 100;
int y = x; // byte -> int (所有byte的值都能进int的范围)
数值类型的隐式转换表
| From | To |
|---|---|
|
|
|
|
|
|
|
|
3. 显式类型转换 (Explicit Conversion, Type Cast)
魔法不够用的时候?
有时候编译器不能保证转换是安全的,就得你自己负责——明确告诉它你知道风险。
- 可能会丢数据。
- 值的格式可能变了。
- 有时候根本转不了——直接报错。
怎么写显式转换?
用括号语法(cast):
double pi = 3.1415;
int wholePi = (int)pi; // 显式转换 double -> int
Console.WriteLine(wholePi); // 3 (小数部分直接丢了!)
什么时候用?
- 当目标类型比源类型窄——目标类型的数据范围更小。
- 可能丢小数、数据、溢出。
- 例子:
- double → int
- long → int
- int → byte
- 几乎所有不兼容类型之间的转换。
4. 看例子学转换
1) 会不会丢数据?来试试!
隐式转换——没问题!
int small = 25;
long big = small; // 隐式转换 (int -> long)
Console.WriteLine(big); // 25
显式转换——危险区!
int big = 1000;
byte small = (byte)big; // 显式转换 (int -> byte)
Console.WriteLine(small); // 232 (!) 因为1000装不进byte (0..255)
注意::
这里的结果是“神奇”的232,因为1000 % 256 == 232。
2) 浮点数(double, float)转换
double number = 9.99;
int approximate = (int)number; // 小数部分直接丢掉
Console.WriteLine(approximate); // 9
3) 整数和浮点数之间的转换 (double ↔ int)
int apples = 5;
double exactApples = apples; // int -> double (隐式)
Console.WriteLine(exactApples); // 5.0
double bananaWeight = 2.77;
int weightForReport = (int)bananaWeight; // double -> int (显式)
Console.WriteLine(weightForReport); // 2
5. 字符串转换:Parse 和 Convert
类型转换在数字和字符串之间不管用!得用专门的方法,比如:
string strNumber = "123";
int num = int.Parse(strNumber); // 或者 Convert.ToInt32(strNumber);
但反过来(int → string)拼接字符串时会自动转换:
int number = 42;
string message = "答案: " + number; // 隐式转换 int → string
6. 类型转换的错误
历史小故事:有次有人忘了显式转换,结果最后付款比该付的少了250倍……同学们,注意点啊!
常见错误:试图隐式转换可能丢数据的类型。
int big = 500;
byte small = big; // 编译器:“不行!可能丢数据!”
这里得用显式转换:
byte small = (byte)big; // 但你可能会丢数据!
另一个常见bug——忘了小数部分:
double x = 2.9;
int y = (int)x; // y == 2,小数部分没了
想按数学规则四舍五入,用Math.Round:
int y = (int)Math.Round(x); // y == 3
7. 转换的坑
- 数据丢失。 一定要检查值有没有超出类型的范围。比如int能装-2 147 483 648到2 147 483 647,byte只有0–255。
- 四舍五入。 普通转换((int)x)直接丢小数。想要正确四舍五入用Math.Round、Math.Floor、Math.Ceiling。
- 数字字面量。 注意3 / 2结果是1(整数除法),3.0 / 2就是1.5(double)!
- 混合类型运算。 如果表达式里混了int和double,结果就是double类型。
GO TO FULL VERSION