查看可空类型是否具有值的最简洁方法是什么,如果有,则将该值与另一个非可空类型的值进行比较?

arc*_*c54 1 c# nullable

我有两个可以为空的枚举,我想比较两个常规枚举的值.如果可以为空的枚举没有值,我希望比较评估为true.这是我的逻辑到目前为止的样子:

if (!nullableEnumOne.HasValue || nullableEnumOne.Value == regularEnumOne) 
    && (!nullableEnumTwo.HasValue || nullableEnumTwo.Value == regularEnumTwo)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

有没有办法简化我错过的逻辑?

Jon*_*eet 13

使用null-coalescing运算符来"默认"到您要比较的值可能是最简单的:

if ((nullableEnumOne ?? regularEnumOne) == regularEnumOne &&
    (nullableEnumTwo ?? regularEnumTwo) == regularEnumTwo)
Run Code Online (Sandbox Code Playgroud)

或坚持使用您当前的代码...或者比较null而不是使用否定条件:

if ((nullableEnumOne == null || nullableEnumOne.Value == regularEnumOne) 
    && ((nullableEnumTwo == null || nullableEnumTwo.Value == regularEnumTwo))
Run Code Online (Sandbox Code Playgroud)

或者有点奇怪,您可以Equals使用null条件运算符调用,使用null coalescing运算符使null case为true:

if ((nullableEnumOne?.Equals(regularEnumOne) ?? true)
   && (nullableEnumTwo?.Equals(regularEnumTwo) ?? true))
Run Code Online (Sandbox Code Playgroud)

诚然,这些都不是大规模可读的.我很想写一个帮助方法,所以你可以写:

if (NullOrEqual(nullableEnumOne, regularEnumOne) &&
    NullOrEqual(nullableEnumTwo, regularEnumTwo))
Run Code Online (Sandbox Code Playgroud)