为什么我们不能在枚举中添加静态方法?

时间:2014-09-23 10:54:54

标签: c# .net static enums

我想知道为什么我们不能在枚举中添加静态方法(只有方法,而不是属性)?对此有任何解释吗?

如果被允许,这将非常有用。

我还想了解谁禁止我们这样做?是IL还是C#?

修改

我不想使用扩展方法。因为我不需要传递该枚举的实例。我不需要它的价值......

我想打电话给FooTypes.GetGoodFoos()而不是FooTypes.BadFoo.GetSomething()

编辑2:

只有我认为这可能更有用而不是在另一个类中编写此方法吗?

public enum Colors
{
    Red,
    LightRed,
    Pink,
    /* .
       .
       . */
    Green

    public static Colors[] GetRedLikes()
    {
        return new Colors[]
        {
            Colors.Red,
            Colors.LightRed,
            Colors.Pink
        }
    }
}

3 个答案:

答案 0 :(得分:4)

正如其他答案所说,这是不可能的。

我知道,这不能回答你的问题,但我想提供一个替代你的例子。 因为,基本上您尝试存档的内容已经可以使用标记。所以,让我带你的#34; GetRedLikes"例如:

[Flags]
public enum Colors : byte
{
    Transparent = 0,                                         // = 0 (00000000)
    Red         = 1 << 0,                                    // = 1 (00000001)
    LightRed    = 1 << 1,                                    // = 2 (00000010)
    Pink        = 1 << 2,                                    // = 4 (00000100)
    Green       = 1 << 3,                                    // = 8 (00001000)

    RedLikes    = Colors.Red | Colors.LightRed | Colors.Pink // = 7 (00000111)
}

然后Colors.RedLikes将包含RedLightRedPink。所有的魔法都是一如既往的。

当然,这个解决方案不允许你做非常复杂的算法,它没有方法类型替换。但它允许您在一组中组合多个枚举。如果您需要更多功能,则必须在额外的类中构建方法。

答案 1 :(得分:3)

我对相同的情况使用静态类:

 public enum SomeEnum
{
    Item1,
    Item2,
    Item3
}

public static class SomeEnumHelper
{
    public static SomeEnum[] GetMainItems() 
    {
        return new[] {SomeEnum.Item1, SomeEnum.Item2};
    }
}

答案 2 :(得分:3)

我们无法向enums添加方法,因为语言是如何制作的,您可以自由阅读C# Language Specification的规范

  

14.3 Enum成员

     

枚举类型声明的主体定义零个或多个枚举成员,它们是枚举类型的命名常量。没有   两个枚举成员可以具有相同的名称。

     
    

enum-member-declarations:enum-member-declaration      enum-member-declarations,enum-member-declaration      enum-member-declaration:attributesopt标识符attributesopt
     identifier = constant-expression

  
     

每个枚举成员都有一个   相关的常数值。该值的类型是底层证券   包含枚举的类型。每个枚举成员的常量值   必须在枚举的基础类型范围内。