CodeGym /课程 /C# SELF /显式和隐式类型转换

显式和隐式类型转换

C# SELF
第 6 级, 课程 5
可用

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
byte
short, ushort, int, uint, long, ulong, float, double, decimal
int
long, float, double, decimal
float
double
char
ushort, int, uint, long, ulong, float, double, decimal

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类型。
2
任务
C# SELF, 第 6 级, 课程 5
已锁定
将浮点数四舍五入到整数
将浮点数四舍五入到整数
2
任务
C# SELF, 第 6 级, 课程 5
已锁定
带数据丢失的数字转换
带数据丢失的数字转换
1
调查/小测验
浮点数第 6 级,课程 5
不可用
浮点数
精度问题和特殊值
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION