为什么没有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是可以理解的,因为它失去了精度。

链接地址: http://www.djcxy.com/p/89383.html

上一篇: Why c# decimals can't be initialized without the M suffix?

下一篇: Android Google Auth Sign In handleSignInResult:false