M 后缀与十进制文字的相关性是什么


decimal l = 50.0M;

我看到过其他答案,建议 M 是将类型显式声明为十进制 - M 在 C# 十进制文字表示法中代表什么?

但是,当变量的类型被专门声明时,为什么要有后缀?当未指定变量的类型时,我可以看到后缀的相关性,例如:

var l = 50.0M

当变量的类型被专门声明时,为什么要有后缀?

仅当要分配的值具有小数点时,才需要强制转换。在您的情况下,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

C# 中的50.0是一个文字double,因此如果没有M后缀,您将尝试将double隐式转换为decimal(不存在的隐式转换(。

使用decimal l = 50.0M; 说:将此小数分配给该十进制变量。

我相信

原因是因为在赋值语句中首先计算右侧。

右侧的值分配给左侧的变量。因此,必须首先评估右侧,然后查看左侧,如果类型不同,则必须进行石膏转换。

最新更新