有没有一种方法可以在一个自定义枚举集合与另一个自定义枚举集合之间进行转换?

时间:2018-07-12 13:46:26

标签: c# collections enums

我们已经知道我们可以convert an enum to another type of enum,因此可以进行以下编译:

public class EnumTest
{
   enum Enum1 { Foo };
   enum Enum2 { Foo };
   void Test () 
   {
       System.Enum e = new Enum2();   // compiles
       Enum1 e1 = (Enum1)new Enum2(); // compiles with an explicit cast
   }
}

但这无法编译:

public class EnumTest
{
   enum Enum1 { Foo };
   enum Enum2 { Foo };
   void Test () 
   {
       List<System.Enum> eList = new List<Enum2>();         // doesn't compile
       List<Enum1> e1List = (List<Enum1>)new List<Enum2>(); // doesn't compile
   }
}

covariance个问题吗?如果没有,是否有办法使其起作用?

2 个答案:

答案 0 :(得分:2)

这不是 co <​​/ em>差异问题,而是 variance 问题。枚举是值类型,值类型不支持协方差。 List<T>class,而不是interfacedelegate。协方差仅适用于接口和委托。

您必须转换/转换列表中的元素:

List<Enum2> list2 = ...
List<System.Enum> eList = list2.Cast<System.Enum>().ToList();

但是,这当然会产生一个新列表。 eList是与list2不同的实例。

答案 1 :(得分:2)

您不能那样投射,Enum1Enum2是完全不同的东西。您可以使用一些简单的Linq来完成。例如:

List<Enum2> eList = new List<Enum2>
{ 
    Enum2.Foo 
};

List<Enum1> e1List = eList
    .Select(x => (Enum1)x)
    .ToList();

请注意,这使用的是大写字母,但您可能希望使用所链接问题的转换功能。