C# 将枚举数组转换为通用枚举数组
如何在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() {
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];
}