[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
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 withconst
, anyreadonly
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:
...compiles (well, Reflectors) to this:
You may want to consider using the "readonly" modifier instead.
const
s are evaluated at compile time, whereasreadonly
s are enforced at run time. Instances of complex types cannot be compiled into the assembly, and so must be created at runtime.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
Then it can't be modified outside the class constructors.
http://en.csharp-online.net/const,_static_and_readonly
Since nullable is a struct, the above quote is the reason why.
You're basically saying:
From a logical point of view... the declaration itself makes no sense.