C#浮点文字:为什么编译器没有DEFAULTS到左侧变量类型

911*_*911 6 c#

要声明浮点数,我们需要为浮点数设置'f',为双打设置'd'.

例:

float num1 = 1.23f;   // float stored as float

float num2 = 1.23;    // double stored as float. The code won't compile in C#.
Run Code Online (Sandbox Code Playgroud)

据说如果省略浮点文字,C#默认为double.

我的问题是,是什么阻止了像'C#'这样的现代语言对左侧变量类型的'DEFAULTS'?毕竟,编译器可以看到整行代码.

这是出于编译器设计的历史原因吗?或者有什么我没有得到的.

Rot*_*tem 7

我想说主要原因是可预测性和一致性.

让我们假设您是编译器,您必须3.14在以下语句中确定文字的类型:


float p = 3.14;
Run Code Online (Sandbox Code Playgroud)

第一个很容易.显然,应该是一个浮动.


这个如何?

var x = 3.14 * 10.0f;
Run Code Online (Sandbox Code Playgroud)

用户明确添加了一个f10.0.那应该是一个float,怎么样3.14?应该x是一个double还是一个float


还有这个:

bool b = 3.14 / 3.14f == 1;
Run Code Online (Sandbox Code Playgroud)

是第3.14一个 double还是一个float?价值b取决于它!


作为一个用户,我宁愿明确添加一个f确切地知道我得到什么.


fur*_*kle 1

这里的其他人可能可以解释为什么 .NET 开发人员决定不使用某种预测来确定如何将数字文字硬塞到您提供给它的类型中。但在缺乏任何哲学的情况下,答案很简单:他们不想这样做,所以他们没有这样做。我不会告诉你你完全不应该关心这个,因为当然希望编译器准确理解你想要的东西并不是完全不合理的。至少会很好,对吧?

(不过,如果我不得不猜测,我会说它与允许某种逻辑隐式类型有很大关系 - float f = 1.0is float,但是var d = 1.0is double?当您考虑到 f.Equals(d) 时,这会变得更不合逻辑false,尽管事实上1.0 == 1.0是这样true。)

但是,假设他们有充分的理由不引入任何特定于类型定义的预测(并且可以在 Rotem 的帖子中找到一些更完美的理由),我可以想象他们认为这是可以double num1 = 1.23接受的,而float num1 = 1.23不是可以接受的最好原因是double坦率地说,在大多数情况下更有用。在大多数用例中,与 32 位浮点值相比,使用 64 位浮点值对 CPU 和 IO 的影响可以忽略不计,但不必担心超出该数据类型的界限,其用处非常大。

1.23请注意,您可以对为什么不能分配给decimal没有后缀的a提出完全相同的论点。设计 C# 的人认为,对任何给定格式的数字文字的类型做出假设都更容易,并且double考虑到大多数编写代码的人1.23想要double或至少应该使用一个,这是一个完全合理的假设。

编辑:用户固定标题。