我希望接下来的三行代码是相同的:
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
在所有情况下,我都分配nullableDateTime
给新变量。我希望所有变量的类型都成为DateTime?
,因为那是nullableDateTime
. 但令我惊讶的是,dateTimeWhatType
just 的类型变成了DateTime
,所以不能为空。
更糟糕的是,ReSharper 建议用空合并表达式替换第二个语句,将其转换为表达式 3。因此,如果我让 ReSharper 做它的事情,变量的类型将从DateTime?
变为DateTime
。
事实上,假设在该方法的其余部分,我会使用
if (someCondition) dateTimeNullable2 = null;
这可以编译得很好,直到我让 ReSharper 用空合并版本替换第二个表达式。
AFAIK,替换
somevar != null ? somevar : somedefault;
和
somevar ?? somedefault;
确实应该产生相同的结果。但是对于可空类型的隐式类型,编译器似乎威胁??
到了它的意思。
somevar != null ? somevar.Value : somedefault;
所以我想我的问题是为什么在我使用时隐式类型会发生变化??
,以及在文档中我可以找到有关此信息的位置。
顺便说一句,这不是真实世界的场景,但我想知道为什么使用??
更改(隐式)类型。