为什么没有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
的隐式转换。 没有从double
到decimal
隐式转换(因为它可能会丢失信息)。
就我个人而言,如果没有违约,或者如果默认值是decimal
,我会更喜欢它,但这是另一回事。
第一个例子是双字面。 第二个例子是一个整数文字。
我想这是不可能的双精度转换为十进制,而不会损失精度,但它可以与一个整数。 所以它们允许用一个整数进行隐式转换。
每一个文字都被视为一种类型。 如果您没有选择'M'后缀,则将其视为double
处理。 你不能隐式地将double
转换为decimal
是可以理解的,因为它失去了精度。
上一篇: Why c# decimals can't be initialized without the M suffix?