views:

147

answers:

3

This is probably a stupid question, but I can't seem to do it. I want to set up some enums in one class like this:

public enum Direction { north, east, south, west };

Then have that enum type accessible to all classes so that some other class could for instance have:

Direction dir = north;

and be able to pass the enum type between classes:

public void changeDirection(Direction direction) {
   dir = direction;
}

I thought that setting the enum to public would make this automatically possible, but it doesn't seem to be visible outside of the class I declared the enum in.

+6  A: 

Declare enum in the scope of a namespace like a class but not into a class:

namespace MyApplication
{
   public enum Direction { north, east, south, west };
}

In case enum is declared in the scope of a class, you have make this class public too:

namespace MyApplication
{
   public class MyClass
   {
      public enum Direction { north, east, south, west };
   }
}

Usage:

MyClass.Direction dir = ...
abatishchev
Could you translate that into noob please?
lala
What exactly don't you understand? - abatishchev's answer explains it all very clearly.
Dal
Yes, after an edit. ;-)
lala
+9  A: 

You can do one of two things.

1- Move the declaration of the enum outside of the class

Today you probably have something like this

public class ClassName
{
  public enum Direction
  {
    north, south, east, west
  }
  // ... Other class members etc.
}

Which will change to

public class ClassName
{      
  // ... Other class members etc.
}

// Enum declared outside of the class
public enum Direction
{
  north, south, east, west
}

2- Reference the enum using the class name

ClassName.Direction.north

Eg.

public void changeDirection(ClassName.Direction direction) { 
   dir = direction; 
}

Where ClassName is the name of the class that you declared the enum in.

Chris Taylor
+2  A: 

It's public, but defining an enum inside a class makes it an inner type of that class. For instance:

namespace MyNamespace
{
    public class Foo
    {
        public enum MyEnum { One, Two, Three }
    }
}

In order to access this enum from another class in the MyNamespace namespace, you have to reference it as Foo.MyEnum, not just MyEnum. If you want to reference it as simply MyEnum, declare it just inside the namespace rather than inside the class:

namespace MyNamespace
{
    public class Foo { ... }

    public enum MyEnum { One, Two, Three }
}
Adam Robinson