C# 为什么这是一个有效的比较

C# 为什么这是一个有效的比较,c#,C#,下面是一些示例代码: static DateTime time; if (time == null) { /* do something */ } 既然DateTime不能为空,为什么要编译此代码 编辑: 问题不仅在于此代码总是返回false,还在于为什么在这种比较中允许像DateTime这样的从不null的东西。虽然time是不可为null的值类型,但它可以转换为可为null并与null进行比较。比较将产生false,这是一个有效的结果 然而,这并不意味着它是一个好代码。诸如re:sharp

下面是一些示例代码:

static DateTime time;
if (time == null)
{
/* do something */
}
既然
DateTime
不能为空,为什么要编译此代码

编辑:
问题不仅在于此代码总是返回false,还在于为什么在这种比较中允许像
DateTime
这样的从不null的东西。

虽然
time
是不可为null的值类型,但它可以转换为可为null并与
null
进行比较。比较将产生
false
,这是一个有效的结果


然而,这并不意味着它是一个好代码。诸如re:sharper之类的工具会用一个警告标记这一行,说“表达式总是错误的”。

我相信这是因为存在从
DateTime
DateTime?
的隐式转换。但是,此转换没有被一致地检查…(或者至少没有被一致地检查…,我确信它曾经有一些奇怪的地方,但我不能用Roslyn重现它们。)Visual Studio 2013为某些值类型(但不是所有值类型)显示警告。例如,如果您使用了
int
而不是
DateTime
,则会得到一条绿色的曲线(警告)“表达式始终为false”;使用
DateTime
您不会收到这样的警告。