我在处理可为空的 DateTime 对象时遇到了一些奇怪的行为。这是一个示例函数:
public DateTime? Weird()
{
DateTime check = DateTime.Now;
DateTime? dt;
if (check == DateTime.MinValue)
dt = null;
else
dt = Viewer.ActiveThroughUTC.ToLocalTime();
//this line give a compile error
dt = (check == DateTime.MinValue) ? (null) : (Viewer.ActiveThroughUTC.ToLocalTime());
return dt;
}
据我所知,有三元运算符的那一行应该和前面四行一样,但是VS2010编译报错,说<null>
之间不存在转换和 DateTime(即使有问题的对象是“DateTime?”)。关于三元运算符,有什么我应该知道的吗?或者这是(喘气?)一个错误?
?:
中的两个元素运算符应该是同一类型(但不一定是 - 请参阅下面的详细信息)。将 null
转换为 DateTime?
:
dt = (check == DateTime.MinValue) ? (DateTime?)null : ...
来自spec :
The second and third operands of the ?: operator control the type of the conditional expression. Let X and Y be the types of the second and third operands. Then,
If X and Y are the same type, then this is the type of the conditional expression.
- Otherwise, if an implicit conversion (Section 6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
- Otherwise, if an implicit conversion (Section 6.1) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
- Otherwise, no expression type can be determined, and a compile-time error occurs.
(有趣的是,它实际上并不称为“三元”运算符。它是一种可能的三元(三值)运算符,我不知道 C# 中还有其他运算符。它称为“?:”运算符,发音有点难。也称为“条件”运算符。)