我有以下行:
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
}