Why is decimal not a primitive type?
Console.WriteLine(typeof(decimal).IsPrimitive);
outputs false.
It is a base type, it’s part of the specifications of the language, but not a primitive. What primitive type(s) do represent a decimal in the framework? An int for example has a field m_value of type int. A double has a field m_value of type double. It’s not the case for decimal. It seems to be represented by a bunch of ints but I’m not sure.
Why does it look like a primitive type, behaves like a primitive type (except in a couple of cases) but is not a primitive type?
Although not a direct answer, the documentation for
IsPrimitivelists what the primitive types are:http://msdn.microsoft.com/en-us/library/system.type.isprimitive.aspx
A similar question was asked here:
http://bytes.com/topic/c-sharp/answers/233001-typeof-decimal-isprimitive-false-bug-feature
Answer quoted from Jon Skeet:
To me, it seems as though
decimalis a type that must exist for a language/runtime wanting to be CLS/CLI-compliant (and is hence termed “primitive” because it is a base type with keyword support), but the actual implementation does not require it to be truly “primitive” (as in the CLR doesn’t think it is a primitive data type).