为什么可以';是否可以在没有M后缀的情况下初始化C#小数
本文关键字:后缀 情况下 小数 初始化 是否 为什么 | 更新日期: 2023-09-27 18:04:35
代码
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
的隐式转换。没有从double
到decimal
的隐式转换(因为它可能会丢失信息(。
就我个人而言,如果没有默认值,或者默认值是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。