为什么不能在没有 M 后缀的情况下初始化 C# 小数?



代码

public class MyClass
{
    public const Decimal CONSTANT = 0.50; // ERROR CS0664
}

产生以下错误:

错误CS0664:无法将double类型的文字隐式转换为键入"decimal";使用'M'后缀创建此类型的文字

如文件所示。但这是有效的:

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

为什么他们禁止第一个?这在我看来很奇怪。

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

float x = 10.0; // Fail

文字的类型应该从文字本身中明确,并且它所分配的变量的类型应该可以从该文字的类型中分配给。第二个例子之所以有效,是因为有一个从int(文字的类型(到decimal的隐式转换。没有从doubledecimal的隐式转换(因为它可能会丢失信息(。

就我个人而言,如果没有默认值,或者默认值是decimal,我会更喜欢它,但那是另一回事。。。

第一个例子是一个双文本。第二个例子是一个整数文本。

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

每个文本都被视为一个类型。如果未选择后缀"M",则会将其视为double。不能隐式地将double转换为decimal是可以理解的,因为它会失去精度。

在您提供的同一链接中,您的答案有点低,也在这里。在转换中:

积分类型隐式转换为十进制,结果计算为十进制。因此,您可以使用不带后缀的整数文字初始化十进制变量。

所以,原因是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

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

它可能源于double可能会失去精度,他们不希望你存储这种损失。int没有这个问题。

来自浮点数字类型

浮点类型和十进制类型之间没有任何隐式转换;因此,必须使用强制转换在这两种类型之间进行转换。

他们这样做是因为double的范围非常大,从±5.0×10−324到±1.7×10308,而int只有-2147483648到2147483647。十进制的范围是(-7.9 x 1028到7.9 x 1028>(/(100到28(,所以它可以保存int,但不能保存double。

最新更新