A discussion earlier today led me to question whether or not my understanding of primtives and literals is correct.
My understanding is that a literal type is spec
Yes, a literal is a value expressed in source code - so while VB supports date/time and XML literals, C# doesn't.
From the C# spec, section 2.4.4:
A literal is a source code representation of a value.
As you say, this is unrelated to value type vs reference type - string is indeed a reference type.
One literal which no-one has mentioned yet it null
by the way...
It's also unrelated to primitive types - from Type.IsPrimitive:
The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single.
... the C# specification doesn't actually define the idea of a "primitive" type, but note that String
isn't in the list above.
In terms of literals being compile-time constants... in C# every literal has a representation which can be baked directly into the assembly; the extra literals in VB mean they're not constants as the CLR would understand them - you can't have a const DateTime
for example - but they're still literals.