C # designers seem to believe that language should prohibit constructs that would have a certain semantics, but would not seem useful, especially if such constructs reflected things that designers did not think people should do.
For example, C # prohibits the use of private types as general restrictions. If the Foo class is not sealed, then declaring the class Bar<T> where T:Foo will declare the Bar<> class family, for which T must be Foo or something derived from it. Semantically, there is no reason that the construct could not have an exact value, even if Foo was a sealed type; if Foo hadn't changed, there would have been no way for T be anything other than Foo , and C # developers would probably say that the code should just use Foo , not T [although if Foo had ever been opened, the value of the common code would no longer correspond to the code specified by Foo ].
Similarly, I suspect that although there would be no particular problem with C # allowing a value type to declare a constant equal to the default value of that type, the usual purpose of constants is to provide a single patch point for things that may need to be changed. Any code that declared const MyPoint = Default(Point); to declare a default location (0,0), may have been driving if it became necessary to have a different default value.
On the other hand, the fact that C # does not allow the declaration of non-standard constants of non-primitive value types other than Decimal does not mean that C # will not be a cable for passing constant values declared in other assemblies if the language developers decided to allow this. If C # allowed the value type constants declared in other assemblies to be used as value type constants in C #, then if it became necessary to use some value other than the default value for the Point constant, it would be possible to add to assembly is a reference to the CIL module that defined the Point constant containing a sequence of bytes that will represent the necessary coordinates, and then use the C # module with a constant from the CIL assembly.
I disagree with the idea that static readonly should be considered a 100% adequate substitute for const , since constant values can be used in contexts where readonly static variable values cannot. However, the fact that C # does not want to consider constants of the type of values from other modules as legitimate constant expressions, unless these types are the ones that it knows about, would greatly limit the usefulness of determining constants of arbitrary types of values.
Adding
Discussions elsewhere caused a more general problem with the values of constant constants: they are stored as a sequence of bytes, which means that their value will greatly depend on the implementation details of the type in question; if later versions of the type store things differently, there would be no mechanism to completely eliminate the sequence of bytes. As a simple example, if one version of the Point type had int fields X and Y in that order, but a later version changed the sequence to Y , X , then a Point constant that was compiled with X = 1 Y = 2 will be interpreted as having Y = 1 X = 2.