【问题标题】:Why c# decimals can't be initialized without the M suffix?为什么没有M后缀就不能初始化c#小数?
【发布时间】:2011-08-04 14:02:14
【问题描述】:
public class MyClass
{
    public const Decimal CONSTANT = 0.50; // ERROR CS0664   
}

产生这个错误:

错误 CS0664:double 类型的文字不能隐式转换为 输入“十进制”;使用“M”后缀来创建这种类型的文字

作为documented。但这有效:

public class MyClass
{
    public const Decimal CONSTANT = 50; // OK   
}

我想知道为什么他们禁止第一个。我觉得很奇怪。

【问题讨论】:

标签: c# .net double decimal


【解决方案1】:

没有后缀m 的文字类型是double - 就这么简单。你也不能这样初始化float

float x = 10.0; // Fail

字面量的类型应该从字面量本身清楚,并且分配给它的变量的类型应该可以分配给来自该字面量的类型。因此,您的第二个示例有效,因为存在从 int(文字类型)到 decimal 的隐式转换。没有从 doubledecimal 的隐式转换(因为它可能会丢失信息)。

如果有 no 默认值或者默认值是 decimal,我个人会更喜欢它,但那是另一回事...

【讨论】:

  • +1 表示不喜欢默认值。双精度和小数在很大程度上对游戏开发者来说是无用的,因此为文字声明默认精度,就像 OpenGL ES 2.0 中的 GLSL,可以消除所有烦人的 F。
  • @Jessy:如果 .net 没有遵循 Java 的要求,要求从 double-to-float 进行愚蠢的类型转换,但反之亦然(尽管从更具体到更少的转换-特定类型应该扩大)将数字文字默认为double会有什么问题吗?编译器无需花费太多时间就可以识别文字何时被用于分配float,并在编译时对其进行转换。
  • 如果这只猫达到100万分,他会获得皇冠和三叉戟,被封为爵士,获得终生供应的饼干,还是......???
  • 虽然从doubledecimal 的转换确实会丢失信息,但在许多情况下它只会丢失精度,因为该值四舍五入到15 位有效数字。尽管在某些情况下,例如3.14159e-26,会丢失更多的精度。然而,转换也很容易溢出(如果操作数是NaN 或数值超过大约8e28),这是不进行隐式转换的另一个很好的理由(类似于为什么缩小整数转换不是隐式的)。跨度>
【解决方案2】:

第一个例子是一个双字面量。第二个例子是一个整数文字。

我想不可能在不损失精度的情况下将双精度数转换为十进制数,但使用整数就可以了。因此它们允许使用整数进行隐式转换。

【讨论】:

    【解决方案3】:

    每个文字都被视为一种类型。如果您未选择“M”后缀,则将其视为double。你不能 implicitlydouble 转换为 decimal 是完全可以理解的,因为它会失去精度。

    【讨论】:

      【解决方案4】:

      在您提供的同一链接中,您的答案略低一些,也是Here。在转化中:

      “整数类型被隐式转换为十进制,结果计算为十进制。因此您可以使用整数文字初始化十进制变量,而无需后缀”。

      所以,原因是因为 int 和 decimal 之间的隐式转换。而且由于 0.50 被视为双精度,并且双精度和十进制之间没有隐式转换,因此您会得到错误。

      更多详情:

      http://msdn.microsoft.com/en-us/library/y5b434w4(v=vs.80).aspx

      http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx

      【讨论】:

        【解决方案5】:

        这是 C# 的创建者做出的设计选择。

        这可能是因为double 可能会丢失精度,并且他们不希望您存储该丢失。 int 没有这个问题。

        【讨论】:

          【解决方案6】:

          来自http://msdn.microsoft.com/en-us/library/364x0z75.aspx: 浮点类型和十进制类型之间没有隐式转换;因此,必须使用强制转换来在这两种类型之间进行转换。

          他们这样做是因为 double 的范围非常大,从 ±5.0 × 10−324 到 ±1.7 × 10308,而 int 只有 -2,147,483,648 到 2,147,483,647。小数的范围是 (-7.9 x 1028 到 7.9 x 1028) / (100 到 28) 所以它可以容纳一个 int但不是双重的。

          【讨论】:

            猜你喜欢
            • 2015-02-20
            • 2012-07-28
            • 1970-01-01
            • 1970-01-01
            • 2021-06-13
            • 2016-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多