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

Yve*_*ves 7 .net c# enums static

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

如果允许它将非常有用.

我也想了解谁禁止我们这样做?是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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

raz*_*zon 6

我在相同情况下使用静态类:

public enum SomeEnum
{
    Item1,
    Item2,
    Item3
}

public static class SomeEnumHelper
{
    public static SomeEnum[] GetMainItems() 
    {
        return new[] {SomeEnum.Item1, SomeEnum.Item2};
    }
}
Run Code Online (Sandbox Code Playgroud)


mod*_*diX 6

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

我知道,这不能回答您的问题,但是我想为您的示例提供替代方法。因为,基本上,您尝试归档的内容都已经可以通过标志实现。因此,让我以您的“ 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)
}
Run Code Online (Sandbox Code Playgroud)

然后Colors.RedLikes将包含RedLightRedPink。与往常一样,所有的魔术都是由一点点完成的。

当然,此解决方案将不允许您执行非常复杂的算法,这不是方法类型的替代。但是,它允许您将多个枚举组合在一起。如果需要其他功能,则必须在额外的类中构建一个方法。


ale*_*dro 0

我们无法添加方法,因为这就是语言的制作方式,您可以自由阅读C# 语言规范enums的规范

14.3 枚举成员

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

枚举成员声明: 枚举成员声明 枚举成员声明 、 枚举成员声明 枚举成员声明: attributeopt 标识符 attributeopt
标识符 = 常量表达式

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

  • 这并不能回答问题。这个决定背后的理由是什么? (5认同)
  • 这并不能回答问题 (3认同)
  • 我知道这是不可能的,但我只是想知道为什么? (2认同)