【发布时间】:2012-04-27 13:47:07
【问题描述】:
我希望接下来的三行代码是相同的:
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 的类型只是变成了DateTime,所以不能为空。
更糟糕的是,ReSharper 建议将第二个语句替换为空合并表达式,将其转换为表达式 3。因此,如果我让 ReSharper 做它的事情,变量的类型将从 DateTime? 更改为 @987654328 @。
事实上,假设在方法的其余部分,我会使用
if (someCondition) dateTimeNullable2 = null;
这会编译得很好,直到我让 ReSharper 用空合并版本替换第二个表达式。
AFAIK,替换
somevar != null ? somevar : somedefault;
与
somevar ?? somedefault;
确实应该产生相同的结果。但是对于可空类型的隐式类型,编译器似乎威胁??,就好像它的意思一样。
somevar != null ? somevar.Value : somedefault;
所以我想我的问题是为什么当我使用 ?? 时隐式类型会发生变化,以及在文档中我可以找到有关此信息的位置。
顺便说一句,这不是真实世界的场景,但我想知道为什么使用 ?? 会改变(隐式)类型。
【问题讨论】:
-
当编译器有足够的信息知道结果永远不会是
null时,你为什么期望nullableDateTime ?? DateTime.Now产生DateTime?? -
@Damien:在我的第一个和第二个示例中,编译器也有足够的信息知道结果永远不会是
null。这正是我觉得这种行为有点奇怪的原因。 -
但是
?:支持更大范围的可能输入(根本没有理由将condition连接到任一结果expression)。因此,编译器设计为针对?:执行此分析是不寻常的。而对于??,它确切地知道结果将是第一个表达式,该表达式不可能为空,或者是第二个表达式。
标签: c# resharper implicit null-coalescing-operator