为什么枚举数组不能用于参数 Enum[]?

时间:2021-02-08 15:53:01

标签: c# enums

似乎对于整数,我可以传递数组或逗号分隔的整数。但是对于枚举,只有逗号分隔的枚举有效。为什么会这样?

    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)
    {
    }

3 个答案:

答案 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)
{
}
相关问题