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

时间:2017-06-14 10:48:20

标签: c# decimal literals

 const Counter = ({ value}) => (<div>{value}</div>);

我看到其他答案表明M要明确地将类型说明为十进制 - What does the M stand for in C# Decimal literal notation?

但是,当变量的类型是专门陈述的时候,为什么要有后缀?当没有指定变量类型时,我可以看到后缀的相关性,如:

    const zcContainerId = ZeroClipboard.config('containerId');
    $(`#${zcContainerId}`).attr('aria-hidden', true);

3 个答案:

答案 0 :(得分:3)

  

当变量的类型被排他性地说明时,为什么要有后缀?

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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