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()
notFooTypes.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)
}