Enum.TryParse不接受我的out参数作为对象



我有以下行:

var parseSortField = (BasicProfileSortableFields?)Enum.TryParse(typeof(BasicProfileSortableFields?), sortOptions.SortColumn, out BasicProfileSortableFields? sortField);

关于out参数,我得到一个错误,上面写着

参数3:无法从"outServices.Models.BasicProfilePortableFields?"转换到"out object?">

常规解析有效,但我正试图捕捉到我的字符串不在上述枚举中的情况。此外,我引用的枚举来自nuget包,如果有帮助的话,它实际上不是我写的。

可为null的枚举可以由Enum.TryParse处理

解决方法:使用?:三元条件运算符处理空情况

BasicProfileSortableFields temp;
BasicProfileSortableFields? parseSortField = Enum.TryParse<BasicProfileSortableFields>(sortOptions.SortColumn, out temp) ? (BasicProfileSortableFields?)temp : null);

Enum.TryParse方法有两种形式:

  • 先有Type参数,后有out object参数的非泛型
  • 没有Type参数(因为使用了泛型类型参数(并且末尾有out TEnum参数的泛型

目前,您似乎处于两者之间的中间位置,但有一个可为null的最终参数(out TEnum?而不是out TEnum(。此外,您正试图将TryParse方法的结果强制转换为枚举类型,而实际上它会返回一个bool,说明解析是否成功。

我建议在代码中使用泛型形式,有点像Fubo的答案,但声明temp变量";内联";在呼叫中:

var sortField =
Enum.TryParse<BasicProfileSortableFields>(sortOptions.SortColumn, out var temp)
? temp
: default(BasicProfileSortableFields?);

Enum.TryParse返回一个布尔值,第三个参数是out object?。您可能想改用Enum.Parse?在这种情况下,只需消除第三个参数,并在try中包装调用。。如果您想在解析失败时进行处理,请捕获。

此外,我认为您希望第一个参数是枚举的类型,而不是枚举的Nullable包装器的类型,但我可能错了。

或者,要继续使用TryParse,您应该首先检查结果,看看解析是否失败,然后将out参数作为object?,如果解析成功,您可以将其转换为目标类型,如下所示:

BasicProfileSortableFields parseSortField;
if(Enum.TryParse(typeof(BasicProfileSortableFields), sortOptions.SortColumn, out object? sortField))
{
parseSortField = (BasicProfileSortableFields)sortField.Value;
}
else
{
// Handle failed parse condition here
}

最新更新