似乎对于整数,我可以传递数组或逗号分隔的整数。但是对于枚举,只有逗号分隔的枚举有效。为什么会这样?
enum Animal { Dog, Cat, Mouse};
void Caller()
{
int[] aaa = { 1, 2, 3 };
Ints(1, 2, 3);
Ints(aaa);
Animal[] bbb = { Animal.Dog, Animal.Cat, Animal.Mouse };
Enums(Animal.Dog, Animal.Cat, Animal.Mouse);
//CS1503 Argument 1: cannot convert from 'Animal[]' to 'System.Enum'
Enums(bbb);
}
void Ints(params int[] aaa)
{
}
void Enums(params Enum[] aaa)
{
}
答案 0 :(得分:3)
问题在于 Enum
不是描述 enum
的“真实”类型,因为前者是一个类,而后者是某种普通的旧整数(你可以描述你想要哪种整数)。更准确地说,Enum
是一个 enum
盒装。
请注意,如果您让编译器构造正确的泛型数组类型,您仍然可以获得完整的功能,同时保持您的函数通用:
void Enums<TEnum>(params TEnum[] aaa) where TEnum: Enum
{
}
答案 1 :(得分:2)
简短的回答是:
因为,任何枚举都继承自Enum
,但数组是协变的,但仅限于类,而枚举不是。所以 Animal[]
不继承自 Enum[]
因此,“逐个参数”传递枚举利用继承来编译代码。
答案 2 :(得分:1)
Animal
是您的枚举类型。修正后的函数:
void Enums(params Animal [] aaa)
{
}