2017-06-14 58 views
2
decimal l = 50.0M; 

我看到其他的答案表明M是明确声明的类型为十进制 - What does the M stand for in C# Decimal literal notation?什么是M后缀的文字小数相关

然而,当类型,变量的,是专说,为什么要有后缀?我可以看到当类型,可变的,不指定,如后缀的相关性:

var l = 50.0M 
+0

喜见.. here..https://stackoverflow.com/questions/977484/what-does-the-m-stand-for-in-c-sharp-decimal-字面符号 – Wheels73

+0

答案是[在这里](https://stackoverflow.com/a/977514/366904),第二个在你关联的问题上。 –

回答

1

50.0在C#是文字double,所以没有M后缀,你试图隐式转换doubledecimal(不存在的隐式转换)。

使用decimal l = 50.0M;说:将该小数点赋值给该十进制变量。

1

我相信原因是因为在赋值语句中首先评估右侧。

右侧的值分配给左侧的变量。所以右侧必须首先评估,然后看左侧,如果类型不同,则必须进行强制转换。

+0

听起来很合理! – Sumith

1

当变量的类型是唯一表示时,为什么应该有后缀?

只有在您分配的值具有小数点的情况下,才需要强制转换。在你的情况下,50.0代表double类型的文字。您可以通过添加一个演员,这样

decimal l = (decimal)50.0; // Do not do this! 

避免后缀,但是这可能导致转换错误:

decimal d = (decimal)1.23456789123456789; 
Console.WriteLine(d); // Prints 1.23456789123457 
decimal e = 1.23456789123456789M; 
Console.WriteLine(e); // Prints 1.23456789123456789 

请注意,以下将编译没有后缀或投,因为intdecimal转换从来没有失去精度:

decimal l = 50; 

,你可能想M后缀另一个地方是在表达s表示操控小数:

decimal tenPercentBroken = myDecimal * 0.1; // Does not compile 
decimal tenPercentCorrect = myDecimal * 0.1M; // Compiles fine 
+0

@CodyGray谢谢你,我提到了l = 50'没有铸造或后缀工作的原因。 – dasblinkenlight