为什么三元运算符和if语句会返回不同的结果?

6
在下面的示例中,我正在使用default返回一个DateTimeOffset?
var a = ConvertToDateTimeOffsetA(null); // 1/1/0001 12:00:00 AM +00:00
var b = ConvertToDateTimeOffsetB(null); // null

private static DateTimeOffset? ConvertToDateTimeOffsetA(DateTime? date)
{
    return date != null
        ? new DateTimeOffset(date.Value, TimeSpan.Zero)
        : default;
}
private static DateTimeOffset? ConvertToDateTimeOffsetB(DateTime? date)
{
    if (date != null) 
        return new DateTimeOffset(date.Value, TimeSpan.Zero);
    return default;
}

为什么三元运算符和if语句返回的结果不同?
我猜是三元运算符先强制类型转换为DateTimeOffset,然后内联转换回Nullable,但我不太确定为什么会这样。
1个回答

12
在三元版本中,它将你的default解释为default(DateTimeOffset),即条件语句中的其他输出表达式类型。然后,它将整个三元表达式解释为可空,但实际上永远不会为空。
在第二种情况下,你的返回值使用了声明的返回类型default(DateTimeOffset?)
在这种情况下,你可以在default表达式中使用显式类型,或者:只需使用第二种形式并添加注释(最好还要加入单元测试),以免将来有人“修复”它。

啊哈 - 谢谢Marc! - KyleMit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接