我想知道为什么我们不能在枚举中添加静态方法(只有方法,而不是属性)?对此有任何解释吗?
如果被允许,这将非常有用。
我还想了解谁禁止我们这样做?是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
}
}
}
答案 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
将包含Red
,LightRed
和Pink
。所有的魔法都是一如既往的。
当然,这个解决方案不允许你做非常复杂的算法,它没有方法类型替换。但它允许您在一组中组合多个枚举。如果您需要更多功能,则必须在额外的类中构建方法。
答案 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每个枚举成员都有一个 相关的常数值。该值的类型是底层证券 包含枚举的类型。每个枚举成员的常量值 必须在枚举的基础类型范围内。