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

2 Answers 2

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

Sign up to request clarification or add additional context in comments.

1 Comment

Oh yes, that makes complete sense now. Finally an answer! :P
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); 
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.