6

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#?

Community
  • 1
  • 1
Lews Therin
  • 10,907
  • 4
  • 48
  • 72

2 Answers2

10

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# :)

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
4

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); 
}
Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452