public class MyClass
{
public const Decimal CONSTANT = 0.50; // ERROR CS0664
}
产生此错误:
错误CS0664:double类型的文字无法隐式转换为 输入'decimal';使用'M'后缀来创建此类型的文字
为documented。但这有效:
public class MyClass
{
public const Decimal CONSTANT = 50; // OK
}
我想知道为什么他们禁止第一个。这对我来说似乎很奇怪。
答案 0 :(得分:47)
没有 m
后缀的文字的类型是double
- 就这么简单。您无法以这种方式初始化float
:
float x = 10.0; // Fail
文字的类型应该从文字本身清楚地表明,并且它所分配的变量的类型应该可以从分配给该文字的类型。因此,您的第二个示例有效,因为存在从int
(文字的类型)到decimal
的隐式转换。没有从double
到decimal
的隐式转换(因为它可能会丢失信息)。
就个人而言,如果没有默认或默认为decimal
,我会更喜欢它,但这是另一回事......
答案 1 :(得分:11)
第一个例子是双字面。第二个例子是整数文字。
我想在没有可能的精度损失的情况下将双精度转换为十进制是不可能的,但是对于整数,它是可以的。所以他们允许使用整数进行隐式转换。
答案 2 :(得分:5)
每个文字都被视为一种类型。如果您不选择“M”后缀,则将其视为double
。您无法implicitly将double
转换为decimal
是完全可以理解的,因为它会失去精确度。
答案 3 :(得分:5)
您的答案在您提供的同一链接中略低,也是Here。在转化中:
“整数类型被隐式转换为十进制,结果计算为十进制。因此,您可以使用整数文字初始化十进制变量,不带后缀”。
所以,原因是因为int和decimal之间的隐式转换。由于0.50被视为double,并且在double和decimal之间没有隐式转换,因此会出现错误。
更多详情:
http://msdn.microsoft.com/en-us/library/y5b434w4(v=vs.80).aspx
答案 4 :(得分:4)
它是C#创作者的设计选择。
可能它会导致double
失去精确度,并且他们不希望你存储这种损失。 int
没有那个问题。
答案 5 :(得分:3)
来自http://msdn.microsoft.com/en-us/library/364x0z75.aspx: 浮点类型和十进制类型之间没有隐式转换;因此,必须使用强制转换来转换这两种类型。
他们这样做是因为双倍具有如此巨大的范围±5.0×10- 324 至±1.7×10 308 而int仅为-2,147,483,648至2,147,483,647。小数的范围是(-7.9 x 10 28 到7.9 x 10 28 )/(10 0到28 )所以它可以保持一个int但不是双倍。