Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enum.GetName() As Constant property

I have been working in C# for about 8 months so forgive me if this is dumb...

I have an enum that I will need the string value several times in a class. So I want to use Enum.GetName() to set it to a string variable which is no problem. I just do it like so...

private string MyEnumString = Enum.GetName(typeof(MyEnum), MyEnum.Name);

And it works just fine.

But I tried to protect it a little better because this particular Enum is more important that all the others and it would not be good if I accidentally changed the string value somehow so I tried to make it const like this.

private const string MyEnumString = Enum.GetName(typeof(MyEnum), MyEnum.Name);

To my eyes this seems fine as it should all be known at compile time.

But Visual Studio 2013 Throws an error saying the "Cannot resolve symbol GetName". I know it works when it is not marked "const".

So this leads me with two questions about this? Why does it loose reference to the GetName enum? (After a bit of research I suspect it is something to do with GetName being a method and not a property of the Enum class but the error message just does not make sense to me)

And Finally is there a way to read the Name of MyEnum.Name to a const string other than what I am doing?

like image 418
DVS Avatar asked Mar 03 '16 13:03

DVS


People also ask

What does enum name() return java?

Description. The java.lang.Enum.name() method returns the name of this enum constant, exactly as declared in its enum declaration.

What is enum variable?

An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it. Common examples include compass directions (values of NORTH, SOUTH, EAST, and WEST) and the days of the week.


1 Answers

Just make it readonly:

private readonly string MyEnumString = Enum.GetName(typeof(MyEnum), MyEnum.Name);

Then it can't be changed afterwards.

You can't assign the result of calling a method to a constant; C# just doesn't allow it - the compiler would have to be calling that method at compile time, possibly before it was even compiled (and not only would it have to generate the IL, it would have to use the JIT compiler to compile that IL).

Enum.GetName(typeof(MyEnum), MyEnum.Name); is calling a method, so you can't assign the result to a constant.

[EDIT] As Jon Skeet says in a comment above, you can use nameof if using C#6 or later (i.e. VS2015 or later):

private const string MyEnumString = nameof(MyEnum.Name);

nameof works because here you are not calling an arbitrary method, but you are instead using a compiler feature to access the name of a type.

like image 50
Matthew Watson Avatar answered Oct 08 '22 09:10

Matthew Watson