C#语言(以及我确定的其他语言)在数字文字的末尾需要后缀。这些后缀表示文字的类型。例如,5m
是小数,5f
是浮点数。
我的问题是:这些后缀真的是必要的,还是可以从其上下文推断出文字的类型?
例如,代码decimal d = 5.0
应该推断5.0
不是double,而是小数。这种语法会导致问题吗?
答案 0 :(得分:9)
通常,我们尝试设计语言,以便有关类型的信息“流出”而不是“流入”。也就是说,表达式的类型是通过首先分析它的每个子表达式来确定的,然后我们看它是否与它的上下文一致 - 我们通常不会采用另一种方式,从上下文到子表达式的推理。当类型信息可以双向流动时,您可以进入一些非常难以分析的情况,就像使用lambda表达式一样。
现在,在你提到的特定情况下,我们可以编写一条规则,说明“可以转换为十进制而不会丢失精度或幅度的浮点文字不需要m后缀” ,就像自动适合短转换的文字整数一样。但是添加“m”很容易,当某些文字自动转换而其他文字没有转换时会让人感到困惑,并且要求类型保持一致会使代码更易于理解和更多自我记录。
答案 1 :(得分:8)
对于像以下这样的简单案例来说这很好:
float f = 7;
但明确要好得多,这样你就不必担心这样的陈述:
float f = (double)(int)(1 / 3 + 6e22 / (double)7);
是的,我知道这是一个人为的例子,但我们不只知道左边的类型编码器的意图,特别是如果它没有被分配一个变量(例如作为参数传递给一个可以采用int,float,double,decimal等的重载函数)。