C# 将枚举数组转换为通用枚举数组

C# 将枚举数组转换为通用枚举数组,c#,arrays,enums,C#,Arrays,Enums,如何在c#中将枚举数组转换为通用枚举数组 要明确的是: 鉴于: public enum PrimaryColor { red = 0, blue = 1, yellow = 3 } public enum SecondaryColor { green = 0, purple = 1, orange = 2 } 我想这样做: public class MyClass { public static void Main() {

如何在c#中将枚举数组转换为通用枚举数组

要明确的是:

鉴于:

public enum PrimaryColor
{
    red = 0,
    blue = 1,
    yellow = 3
}

public enum SecondaryColor
{
    green = 0,
    purple = 1,
    orange = 2
}
我想这样做:

public class MyClass
{
    public static void Main()
    {
        PrimaryColor[] pca = {PrimaryColor.blue, PrimaryColor.yellow};
        SecondaryColor[] sca = {SecondaryColor.purple, SecondaryColor.orange};

        Enum[] enumArray = pca;
    }

}
这导致编译器错误为:

Cannot implicitly convert type 'PrimaryColor[]' to 'System.Enum[]'

我可以使用linq或一些更迭代的过程,但我想知道是否有更好的cast可以替代它。

您只能迭代地执行它

Enum[] enumArray = Array.ConvertAll(pca, item => (Enum)item);
或者(效率较低,但Linq!)


for(int i=0;iI)编辑了您的标题。请参见“”,其中一致意见是“不,他们不应该”。类型系统中一个有趣的奇怪之处是CLR类型系统允许兼容值类型上的数组协方差。例如,
uint[]
可转换为
int[]
.C#正如您正确指出的,仅当两种类型都是引用类型时才允许数组协方差。这意味着在C#中,强制转换
(int[])(对象)x
将在运行时成功,但没有
对象的同一强制转换将在编译时失败。@EricLippert谢谢,评论很好!不知道允许在兼容的值类型上使用数组协方差。顺便问一下,为什么
枚举
在上面的示例中不认为兼容?即我可以执行
(int[])(object)pca
,但我无法执行
(Enum[])(object)pca
。VS2012中似乎也存在错误:)Enum是引用类型;这是一个装箱的枚举。因此,数组必须充满引用,而不是值。有关CLR方差与C#方差的区别,请参阅和。
Enum[] enumArray = pca.Cast<Enum>().ToArray();
Foo[] foos = new Foo[10];
object[] array = (object[])foos;
PrimaryColor[] pca = { PrimaryColor.blue, PrimaryColor.yellow };
SecondaryColor[] sca = { SecondaryColor.purple, SecondaryColor.orange };

Enum[] enumArray = pca.Select(q => q as Enum).ToArray();
for (int i=0; i<pca.Count();i++)
{
    enumArray[i] = pca[i];                
}