我希望接下来的三行代码是相同的:
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?
以DateTime
。
事实上,让我们说,在该方法的其余部分,我会用
if (someCondition) dateTimeNullable2 = null;
这将编译就好了,直到我让ReSharper的替换与空合并版本的第二个表达式。
据我所知,更换
somevar != null ? somevar : somedefault;
同
somevar ?? somedefault;
确实应该产生相同的结果。 但在可空类型隐式类型,编译器似乎威胁??
仿佛这意味着什么。
somevar != null ? somevar.Value : somedefault;
所以我想我的问题是,为什么当我使用隐式类型发生变化??
,并且还当文档中我能找到这些信息。
顺便说一句,这不是一个真实的场景,但我想,为什么使用知道??
改变(隐式)型。