双重暗示的目的是什么?

l--*_*''' 13 c#

例如:

const decimal dollars = 25.50M;
Run Code Online (Sandbox Code Playgroud)

为什么我们要添加M

为什么不这样做:

const decimal dollars = 25.50;
Run Code Online (Sandbox Code Playgroud)

因为它已经说过decimal,这不是暗示25.50是小数吗?

SLa*_*aks 22

没有.

25.50是一个独立的类型表达式double,而不是decimal.
编译器不会看到您尝试将其分配给decimal变量并将其解释为小数.

除了lambda表达式,匿名方法和条件运算符之外,所有C#表达式都有一个完全不依赖于上下文的固定类型.

想象一下,如果编译器按照您的意愿执行操作会发生什么,并且您调用了Math.Max(1, 2).
Math.Max有采取过载int,doubledecimal.它会叫哪一个?

  • @jenny,为了领先于下一个问题,`double d = 1/2`等于0.想一想为什么在这个问题和答案的背景下. (5认同)
  • 他们这样做,后缀为"M". (2认同)

Cha*_*ion 10

在这种情况下,有两个重要的概念需要理解.

  1. 文字价值观
  2. 隐式转换

基本上你要问的是文字值是否可以在两种类型之间隐式转换.在没有精度损失的情况下,编译器实际上会为您执行此操作.以此为例:

long n = 1000; // Assign an Int32 literal to an Int64.
Run Code Online (Sandbox Code Playgroud)

这是可能的,因为long(Int64)与int(Int32)相比包含更大范围的值.对于您的具体示例,可能会失去精度.下面是针对完全不同的范围decimaldouble.

Decimal: ±1.0 × 10?28 to ±7.9 × 1028
Double: ±5.0 × 10?324 to ±1.7 × 10308

有了知识,很明显为什么隐式转换是个坏主意.以下是C#编译器当前支持的隐式转换列表.我强烈建议你做一些关于这个问题的轻读.

隐式数字转换表