【问题标题】:convert an array of enums into a generic array of enums将枚举数组转换为通用枚举数组
【发布时间】:2013-01-17 00:15:23
【问题描述】:

如何在 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 或更多迭代过程,但我想知道是否有更好的演员可以代替。

【问题讨论】:

标签: c# arrays enums


【解决方案1】:

你只能迭代地做它

Enum[] enumArray = Array.ConvertAll(pca, item => (Enum)item);

或者(效率较低,但 Linq!)

Enum[] enumArray = pca.Cast<Enum>().ToArray();

为什么不能简单地转换数组?因为在 C# covariance 中,仅对引用类型的数组启用(枚举是值类型)。因此,使用Foo 课程,您可以这样做:

Foo[] foos = new Foo[10];
object[] array = (object[])foos;

【讨论】:

  • 类型系统中一个有趣的奇怪之处是 CLR 类型系统允许在兼容的值类型上进行数组协变。例如,uint[] 可转换为 int[]。正如您正确指出的那样,C# 仅在两种类型都是引用类型时才允许数组协方差。这意味着在 C# 中,(int[])(object)x 的转换可能会在运行时成功,但没有object 的相同转换可能会在编译时失败。
  • @EricLippert 谢谢,很棒的评论!不知道允许兼容值类型的数组协方差。顺便说一句,为什么Enum 不认为是兼容的,例如上面的例子? IE。我可以做(int[])(object)pca,但我不能做(Enum[])(object)pca。看起来 VS2012 s4.postimage.org/c17b94me5/array_covariance.png 中也有一个错误 :)
  • 枚举是引用类型;这是一个盒装枚举。因此数组必须充满references,而不是充满values
  • 请参阅blogs.msdn.com/b/ericlippert/archive/2009/09/24/…stackoverflow.com/questions/1178973/…,了解有关 CLR 方差与 C# 方差有何不同的更多详细信息。
【解决方案2】:
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];                
}

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多