为什么没有M后缀就无法初始化c#小数?

ono*_*nof 35 .net c# double decimal

public class MyClass
{
    public const Decimal CONSTANT = 0.50; // ERROR CS0664   
}
Run Code Online (Sandbox Code Playgroud)

产生此错误:

错误CS0664:double类型的文字不能隐式转换为'decimal'类型; 使用'M'后缀来创建此类型的文字

作为记录.但这有效:

public class MyClass
{
    public const Decimal CONSTANT = 50; // OK   
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么他们禁止第一个.这对我来说似乎很奇怪.

Jon*_*eet 47

该类型文字的没有m后缀是double-它就是这么简单.您无法以float这种方式初始化:

float x = 10.0; // Fail
Run Code Online (Sandbox Code Playgroud)

该类型的文字的,应明确从字面本身,变量的类型会被分配给应分配给那个字面的类型.所以你的第二个例子是有效的,因为有一个从int(文字的类型)到的隐式转换decimal.有没有从隐式转换doubledecimal(因为它可能会丢失信息).

就个人而言,如果没有违约或默认情况decimal,我会更喜欢它,但这是另一回事......

  • +1表示不喜欢默认值.双打和小数对于游戏开发者来说基本上是无用的,因此声明文字的默认精度,即OpenGL ES 2.0中的GLSL,可以消除所有烦人的F. (4认同)

Jam*_*ton 11

第一个例子是双字面.第二个例子是整数文字.

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


Osk*_*lin 5

每个文字都被视为一种类型.如果您没有选择"M"后缀,则将其视为a double.你无法隐式地将a转换double为a decimal是可以理解的,因为它会失去精确性.


AJC*_*AJC 5

您在同一个链接中的答案有点低,也在这里.在转化中:

"积分类型隐式转换为十进制,结果计算为十进制.因此,您可以使用整数文字初始化十进制变量,不带后缀".

所以,原因是因为int和decimal之间的隐式转换.并且由于0.50被视为double,并且在double和decimal之间没有隐式转换,因此会出现错误.

更多细节:

http://msdn.microsoft.com/en-us/library/y5b434w4(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx