Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我们不能向枚举添加静态方法吗?_C#_.net_Static_Enums - Fatal编程技术网

C# 为什么可以';我们不能向枚举添加静态方法吗?

C# 为什么可以';我们不能向枚举添加静态方法吗?,c#,.net,static,enums,C#,.net,Static,Enums,我想知道为什么我们不能在枚举中添加静态方法(只添加方法,不添加属性)?有什么解释吗 如果允许的话,这将是非常有用的 我也想知道谁禁止我们这么做?是IL还是C 编辑: 我不想使用扩展方法。因为我不需要传递该枚举的实例。我不需要它的价值在那里 我想调用类似于FooTypes.GetGoodFoos()的东西,而不是FooTypes.BadFoo.GetSomething() 编辑2: 难道只有我认为这比在另一个类中编写这个方法更有用吗 public enum Colors { Red,

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

如果允许的话,这将是非常有用的


我也想知道谁禁止我们这么做?是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
        }
    }
}

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

 public enum SomeEnum
{
    Item1,
    Item2,
    Item3
}

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

我们无法将方法添加到
enums
,因为这是语言的制作方式,您可以自由阅读

14.3枚举成员

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

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

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


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

我知道,这并不能回答你的问题,但我想给你一个替代的例子。 因为,基本上,您尝试归档的内容已经可以使用标志了。让我以你的“GetRedLikes”为例:

[标志]
公共枚举颜色:字节
{
透明=0,//=0(00000000)

Red=1您可以为枚举创建扩展方法。我认为这比向实际枚举中添加方法(静态或非静态)更干净。@b但要调用扩展方法,我们需要该枚举的实例。我只想调用
FooTypes.GetValues()
not
FooTypes.FirstValue.SomeMethod()
为什么要对技术上还不存在的东西调用方法。特别是Enum我能看到的唯一有用的方法是获取列表,但它是简单的反射
Enum.GetNames(typeof(MyEnum));
@frank我想创建一个方法,将一些Enum的值作为数组返回。例如:
Colors.GetLightColors()
我不认为这是一种不好的方法……这可以使我的代码更简单。是我编写的返回字符串数组的方法。提到MyEnum是enum的enum而不是值,我认为这是不可能的(我正在等待更正),但它肯定更简单,制作一个实现您需要的纯引用类型我知道这是不可能的,但我只是想知道为什么?“我还想知道谁禁止我们这样做?是IL还是C#?”通过引用C#spec,你是在暗示它是C#。你能用IL写一个有静态方法的枚举吗?这并不能回答这个问题。我发现,
enum
在IL中被认为是
常量
。因为我们可以编写一个类来包含我们的静态方法以使其工作,也许C#编译器也可以为我们这样做。对吗?所以方法就像他们在编译代码中自动添加
type getFoo()
void setFoo(type value)
时对
properties所做的那样……在我的例子中,我想要的是“静态MyEnum Random{get{return(MyEnum)rand(minEnum,maxEnum)}//简化的伪代码随机函数”然后像MyEnum x=MyEnum.Random ofc一样使用它。这只是一个语法糖,毫无疑问,以其他方式做同样的事情
[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)
}