如何解决如何解决以下示例的装箱或转换错误?
在下面的代码中;
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 ; }
}
解决方法
使用 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-ext 的 Either 类型。
通过这个小类,您可以执行以下操作:
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 举报,一经查实,本站将立刻删除。