Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't nullables be declared const?

[TestClass]
public class MsProjectIntegration {
    const int? projectID = null;
    // The type 'int?' cannot be declared const
    // ...
}

Why can't I have a const int??

Edit: The reason I wanted a nullable int as a const is because I'm just using it for loading some sample data from a database. If it's null I was just going to initialize sample data at runtime. It's a really quick test project and obviously I could use 0 or -1 but int? just felt like the right data structure for what I wanted to do. readonly seems like the way to go

like image 818
Shawn Avatar asked Dec 02 '09 15:12

Shawn


3 Answers

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;
like image 151
Tim Robinson Avatar answered Oct 13 '22 17:10

Tim Robinson


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.

like image 35
Blake Pettersson Avatar answered Oct 13 '22 18:10

Blake Pettersson


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.

like image 40
Binary Worrier Avatar answered Oct 13 '22 17:10

Binary Worrier