如何将泛型枚举类型传入Enum.Parse()并解决CS0453错误?
问题描述
我定义了一个泛型record类:
public record OperationCollectionGeneric<OPERATIONTYPE> where OPERATIONTYPE: notnull, Enum { public OPERATIONTYPE Group { get; } public OperationCollectionGeneric(string part1, string? part2 = null, string? part3 = null) { Group = Enum.Parse<OPERATIONTYPE>(part1, true); } }
调用Enum.Parse()方法时出现以下错误:
Error CS0453 The type 'OPERATIONTYPE' must be a non-nullable value type in order to use it as parameter 'TEnum' in the generic type or method 'Enum.Parse(ReadOnlySpan
, bool)'
我希望确保OPERATIONTYPE参数为Enum类型,已尝试用where关键字设置枚举约束但无效,该如何处理?
解决方案
问题出在泛型约束的定义上:Enum.Parse<TEnum>的泛型参数TEnum要求必须是非空的值类型枚举。你当前的notnull, Enum约束虽然排除了null引用类型,但没明确限定是值类型——C# 8.0及以后,可为空的枚举类型(比如SomeEnum?)也满足notnull, Enum约束,但它属于可空值类型,不符合Enum.Parse的参数要求。
只需把泛型约束改成struct, Enum即可:
public record OperationCollectionGeneric<OPERATIONTYPE> where OPERATIONTYPE : struct, Enum { public OPERATIONTYPE Group { get; } public OperationCollectionGeneric(string part1, string? part2 = null, string? part3 = null) { Group = Enum.Parse<OPERATIONTYPE>(part1, true); } }
struct约束确保OPERATIONTYPE是值类型,结合Enum约束,就能严格限定它是非空的枚举值类型,完全匹配Enum.Parse<TEnum>的参数要求。
内容的提问来源于stack exchange,提问作者Azarakhsh Hamedi
相关产品推荐
相关产品推荐

