为什么需要数字后缀?

C#语言(以及我确定的其他语言)在数字文字的末尾需要后缀。 这些后缀表示文字的类型。 例如, 5m是小数, 5f是浮点数。

我的问题是:这些后缀真的是必要的,还是可以从其上下文推断出文字的类型?

例如,代码decimal d = 5.0应该推断5.0不是double,而是小数。 这种语法会导致问题吗?

这对于简单的情况很好,例如:

 float f = 7; 

但是要明确这样做要好得多,这样你就不必担心这样的陈述:

 float f = (double)(int)(1 / 3 + 6e22 / (double)7); 

是的,我知道这是一个人为的例子,但我们知道编码器的意图来自左侧的类型, 特别是如果它根本没有被分配给变量(例如作为参数传递给重载函数)可以采用int,float,double,decimal等之一。

通常,我们尝试设计语言,以便有关类型的信息流出“out”而不是“in”。 也就是说,表达式的类型是通过首先分析它的每个子表达式来确定的,然后我们看它是否与它的上下文一致 – 我们通常不会采用另一种方式,从上下文推理到子表达式。 当类型信息可以双向流动时,您可以进入一些非常难以分析的情况,就像使用lambda表达式一样。

现在,在你提到的特定情况下,我们可以编写一条规则,说“浮点文字可以转换为十进制而不会丢失精度或幅度,不需要m后缀”,就像适合短转换的文字整数一样自动。 但是添加“m”很容易,当某些文字自动转换而其他文字没有转换时会让人感到困惑,并且要求类型保持一致使代码更容易理解和更自我记录。