Search code examples
c#.netdoubledecimal

Why can't C# decimals be initialized without the M suffix?


The code

public class MyClass
{
    public const Decimal CONSTANT = 0.50; // ERROR CS0664
}

produces this error:

error CS0664: Literal of type double cannot be implicitly converted to type 'decimal'; use an 'M' suffix to create a literal of this type

as documented. But this works:

public class MyClass
{
    public const Decimal CONSTANT = 50; // OK
}

Why did they forbid the first one? It seems weird to me.


Solution

  • The type of a literal without the m suffix is double - it's as simple as that. You can't initialize a float that way either:

    float x = 10.0; // Fail
    

    The type of the literal should be made clear from the literal itself, and the type of variable it's assigned to should be assignable to from the type of that literal. So your second example works because there's an implicit conversion from int (the type of the literal) to decimal. There's no implicit conversion from double to decimal (as it can lose information).

    Personally I'd have preferred it if there'd been no default or if the default had been decimal, but that's a different matter...