This might get downvoted, but this question has been bothering me since yesterday.. until I found a link then I knew I wasn't really crazy lol: Enum as instance variables
I'm basically asking the opposite of the OP's question. Given:
enum Coffee {
BIG,
SMALL }
public class MyClass {
private Coffee coffee;
// Constructor etc.
}
Although this is Java and enums do differ somewhat in both languages how is it that I can't do coffee.BIG or coffee.BIG.SMALL (though it makes little sense when reading it, it should be possible considering coffee is of type Coffee) in C#?
It is not possible to have enum of enums, but you could represent your data by having the type and cause separately either as part of a struct or allocating certain bits for each of the fields.
Enums are very powerful as they may have instance variables, instance methods, and constructors. Each enum constant should be written in capital letters. Every enum constant is by default internally public static final of type Enum declared.
Get the value of an Enum To get the value of enum we can simply typecast it to its type. In the first example, the default type is int so we have to typecast it to int. Also, we can get the string value of that enum by using the ToString() method as below.
This isn't really to do with enums. It's to do with accessing static members in general.
Java has a design flaw (IMO) which allows you to access static members as if they were instance members, via an expression of that type. It can lead to very confusing code:
Thread thread = new Thread(...);
thread.start();
// This looks like it makes the new thread sleep, but it actually makes the
// current thread sleep
thread.sleep(1000);
Additionally, there's no nullity check as the value of the expression is irrelevant:
Thread thread = null;
thread.sleep(1000); // No exception
Now, consider that enum values are implicitly static, and you can see why there's the difference.
The fact that you've acknowledged that "it makes little sense when reading it" suggests that at heart you agree that this is a flaw within Java, not within C# :)
In C# (unlike Java) it is not legal to access a static field via an instance of that class.
If you write this:
coffee.BIG.SMALL
Then the error you get is:
Member 'coffee.SMALL' cannot be accessed with an instance reference; qualify it with a type name instead
This code also won't work for the same reason:
void Foo(coffee c)
{
// Member 'coffee.SMALL' cannot be accessed with an instance reference
Console.WriteLine(c.SMALL);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With