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

问题描述 投票:0回答:6

代码

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

产生此错误:

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

如记录。但这有效:

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

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

c# .net double decimal
6个回答
48
投票

不带m后缀的文字

的类型是
double
 - 就这么简单。您也无法以这种方式初始化 
float

float x = 10.0; // Fail

文字的类型应该从文字本身就清楚,并且它分配给的变量的类型应该可以从该文字的类型分配给

from。因此,您的第二个示例之所以有效,是因为存在从 int

 (文字类型)到 
decimal
 的隐式转换。没有从 
double
decimal
 的隐式转换(因为它可能会丢失信息)。

就我个人而言,如果没有

默认值或者默认值是decimal,我会更喜欢它,但那是另一回事......

    


11
投票

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


5
投票
double

。您不能

隐式
double转换为
decimal
,这是可以理解的,因为它会失去精度。
    


5
投票
这里

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

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


4
投票

它可能源于

double

可能会失去精度,并且他们不希望您存储该损失。

int
没有这个问题。
    


3
投票
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,但不能容纳 double。

© www.soinside.com 2019 - 2024. All rights reserved.