微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在下面的代码中;

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}")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。