什么是十进制字面量中M后缀的相关性?

5
decimal l = 50.0M;

我看到其他答案建议 M 表示显式声明类型为十进制 - C# 中 Decimal 字面量符号 M 的含义是什么?

然而,当变量的类型被明确指定时,为什么还需要后缀呢?我可以理解当变量的类型没有指定时后缀的相关性,像这样:

var l = 50.0M

嗨,请看这里:https://dev59.com/JHNA5IYBdhLWcg3wZ8_U - Wheels73
答案就在这里:https://dev59.com/JHNA5IYBdhLWcg3wZ8_U#977514,是你提供的问题的第二个回答。 - Cody Gray
3个回答

6
当变量的类型明确指定时,为什么还需要后缀?
只有在分配的值有小数点时才需要转换。在您的情况下,“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 后缀:

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

@CodyGray 谢谢,我提到了l=50能够不需要强制转换或后缀的原因。 - Sergey Kalinichenko

1

50.0在C#中是一个字面量的double,所以如果没有M后缀,你正在尝试将double隐式转换为decimal(一种不存在的隐式转换)。

使用decimal l = 50.0M;表示:将这个十进制数赋给那个十进制变量。


1
我认为这是因为在赋值语句中,右侧先被评估。右侧的值被赋给左侧的变量。因此,右侧必须先被评估,然后它会查看左侧,如果类型不同,则需要进行转换。

听起来合理! - Social Developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接