【问题标题】:Learning C# and I have a casting question学习 C#,我有一个选角问题
【发布时间】:2021-05-04 05:00:16
【问题描述】:

W3学校提供以下代码:

double myDouble = 9.78;
int myInt = (int) myDouble;    // Manual casting: double to int

Console.WriteLine(myDouble);   // Outputs 9.78
Console.WriteLine(myInt);      // Outputs 9

在第 2 行,如果我已经声明变量类型是 'int',为什么我已经将 myDouble 声明为整数,但我还必须将其转换为整数?

我在我正在使用的书中看到了同样的内容,其中一行是:

float num1 = (float) 20.9;
decimal num2 = (decimal) 20.9;

同样,在我们已经告诉它使用特定数据类型之后,我们将数据类型放在括号中。我确信后端有原因,我只是不知道它是什么。

【问题讨论】:

  • TLDR 是:告诉编译器您在使用可能导致数据丢失的转换时知道自己在做什么。
  • 没有这个,你可能会永远追逐一个奇怪的缺陷,并且不知道为什么myInt 的值不是你所期望的。如果您知道有转换,您可以查看the documentation 并准确了解它是如何转换的。

标签: c# types casting


【解决方案1】:

你理解错了。

首先,如果你不告诉编译器不要这样做,c# 中的任何点号都会被处理为双精度数。

如果你这样做:

int number = 20.5

你是

  1. 声明number 类型为int 的变量
  2. 为其分配double 类型的值

这行不通。由于您无法将doubles 存储在ints 中,因此此处将不起作用...

如果你这样做

int number = (int) 20.5 可以工作,但您将double 转换为int 所以number 将是20 而不是20.5

在第 2 行,如果我已经声明变量类型是 'int',为什么我已经将 myDouble 声明为整数,但我还必须将其转换为整数?

不,你没有。您声明了int 类型的变量,但您尝试分配给它的值不是int 类型而是double,因此您需要先将其转换为int,然后才能分配给它。

在你的第二个例子中,你有同样的故事......

您尝试分配的数字是double 类型(就像我之前所说的那样),因此您需要先将它们转换为floatdecimal,然后再将它们分配给变量。

你可以这样做:

float myFloat = 20.5f

看到f了吗?这样你就告诉编译器你希望这个数字被处理为浮点数而不是双精度数,所以在这里你不需要强制转换。

我鼓励你阅读和学习不同的数据类型以及它们之间的差异(内存大小、范围等),否则你真的会遇到大问题,比如这个......

A space error: $370 million for an integer overflow

【讨论】:

  • 我很感激。我只是冒险进入这个,有些东西没有点击。感谢您清理它。
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多