如何解决以下示例的装箱或转换错误?

问题描述

在下面的代码中;

CustomClass<EnType1> a = new CustomClass<EnType1>();
CustomClass<TEnum<EnType1>> b = new CustomClass<TEnum<EnType1>>();

抛出错误

类型 ConsoleApp2.TEnum<ConsoleApp2.EnType1> 不能用作泛型类型或方法 T 中的类型参数 CustomClass<T>。没有从 ConsoleApp2.TEnum<ConsoleApp2.EnType1>System.Enum 的隐式引用转换。类型 ConsoleApp2.EnType1 不能用作泛型类型或方法 T 中的类型参数 CustomClass<T>。没有从 ConsoleApp2.EnType1ConsoleApp2.IEnum 的拳击转换。

我该如何解决这个问题?

基本上我想创建一个通用类,我应该能够使用任何 Enum 以及从 IEnum 继承的任何类

感谢任何帮助

完整代码

class Program
{
    static void Main(string[] args)
    {
        CustomClass<EnType1> a = new CustomClass<EnType1>();
        CustomClass<TEnum<EnType1>> b = new CustomClass<TEnum<EnType1>>();

        TEnum<EnType2> t = new TEnum<EnType2>(EnType2.B);
        Console.WriteLine("Hello World!" + t.EnumValue);
    }
}

在这个泛型类中,我应该能够使用任何 Enum 以及继承自 IEnum 的任何类

public class CustomClass<T> where T : Enum,IEnum
{
    public T Enum;
}

enum EnType1
{
    A = 2,B = 3
}

enum EnType2
{
    A = 0,B = 1
}

public interface IEnum
{
    public int EnumValue { get; set; }
}

public class TEnum<T> : IEnum
{
    public TEnum(T enumVal)
    {
        EnumValue = (int)(object)enumVal;
    }
    public int EnumValue { get ; set ; }
}

解决方法

使用 OneOf,您可以创建一个自定义类,它表示内置枚举或自定义枚举。

public class EitherEnum : OneOfBase<Enum,IEnum>
{
    public EitherEnum(OneOf<Enum,IEnum> _)
        : base(_) { }

    public bool IsStandard => IsT0;
    public Enum Standard => AsT0;

    public bool IsCustom => IsT1;
    public IEnum Custom => AsT1;
}

您不能使用 OneOf<T1,T2>,因为它是一个 struct,不能用作 generic constraint。这同样适用于 Language-extEither 类型。

通过这个小类,您可以执行以下操作:

public class CustomClass<T> where T : EitherEnum
{
    public T Enum;
}

CustomClass<EitherEnum> cc = new CustomClass<EitherEnum>();
cc.Enum = new EitherEnum(EnType1.A);
//OR
cc.Enum = new EitherEnum(new CustomEnum());

cc.Enum.Switch(
    standard => Console.WriteLine($"Standard: {standard}"),custom => Console.WriteLine($"Custom: {custom}"));
//OR
if(cc.Enum.IsStandard)
   Console.WriteLine($"Standard: {cc.Enum.Standard}")
else if (cc.Enum.IsCustom)
   Console.WriteLine($"Custom: {cc.Enum.Custom}")