首页 > 解决方案 > 如何解决以下示例的装箱或转换错误?

问题描述

在下面的代码中;

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.EnType1从到没有拳击转换ConsoleApp2.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 ; }
}

标签: c#genericsenumscastingboxing

解决方案


使用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并且不能用作通用约束。同样适用于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}")

推荐阅读