Why can't nullables be declared const?

谁都会走 提交于 2019-12-03 23:36:23

It's not just nullables; only types built into the runtime can be declared const (from memory, it's bools, the various types of int, floats/doubles, and strings).

Why? Because the value gets embedded directly into the assembly at compile time, and there's no way to embed user-defined types.

The readonly keyword should do what you need, however. By contrast with const, any readonly fields get initialized at runtime rather than compile time, so they can be initialized with more or less any expression you want.

Edit: as Eric Lippert points out, it's not this straightforward. For instance, const decimal works.

This:

private const decimal TheAnswer = 42;

...compiles (well, Reflectors) to this:

[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)]
private static readonly decimal TheAnswer;

http://en.csharp-online.net/const,_static_and_readonly

Constants must be of an integral type (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, or string), an enumeration, or a reference to null.

Since classes or structures are initialized at run time with the new keyword, and not at compile time, you can't set a constant to a class or structure.

Since nullable is a struct, the above quote is the reason why.

You can't have a const reference type (or a struct), therefore you can't have a const int? which is really just a Nullable<int>.

You can mark it as readonly

readonly int? projectID = null;

Then it can't be modified outside the class constructors.

You're basically saying:

I have a class with a projectId field that may or may not have a value, but that in fact NEVER has a value, it's is always undefined.

From a logical point of view... the declaration itself makes no sense.

You may want to consider using the "readonly" modifier instead.

consts are evaluated at compile time, whereas readonlys are enforced at run time. Instances of complex types cannot be compiled into the assembly, and so must be created at runtime.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!