双重暗示的目的是什么?

时间:2010-10-05 18:16:51

标签: c#

例如:

const decimal dollars = 25.50M;

为什么我们必须添加M

为什么不这样做:

const decimal dollars = 25.50;

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

3 个答案:

答案 0 :(得分:22)

没有

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

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

想象一下,如果编译器按照您的意愿执行操作会发生什么,并且您调用了Math.Max(1, 2) Math.Max包含intdoubledecimal的重载。它会叫哪一个?

答案 1 :(得分:10)

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

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

    long n = 1000; // Assign an Int32 literal to an Int64.
    

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

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

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

    Implicit Numeric Conversions Table

答案 2 :(得分:3)

另请注意,由于定义了双精度和小数的内部细节,您的分配或计算中可能会出现轻微的舍入错误。你需要知道浮点数,双精度数和小数数如何在位级工作,以便始终做出最佳选择。

例如,double不能精确地存储值25.10,但是小数可以。

可以精确地存储值25.50但是,出于有趣的二进制编码原因。

Decimal structure