ReSharper为什么告诉我,我的表达总是如此?

时间:2016-04-20 16:15:33

标签: c# linq

我有这个LINQ语句,如果序列为空则返回null。我将结果分配给可空的DateTime。稍后我会检查DateTime.HasValue属性和ReSharper是否告诉我表达式始终为真。

DateTime? latestUploadDateInBLSO = Documents.Where(d => d.DocumentLinkId == documentLinkId &&
                                                                  d.UploadedInStage.StageNumber == 6 &&
                                                                  d.DocumentOwnerTeam.TeamId == AuthorUser.Team.TeamId)
                                                                  .Select(d => d.UploadedOnDate)
                                                                  .DefaultIfEmpty()
                                                                  .Max();

if (latestUploadDateInBLSO.HasValue) { // <-- Says this is always true
                    Documents.Single(d => d.DocumentLinkId == documentLinkId &&
                                          d.UploadedOnDate == latestUploadDateInBLSO &&
                                          d.UploadedInStage.StageNumber == 6 &&
                                          d.DocumentOwnerTeam.TeamId == AuthorUser.Team.TeamId).IsLatestVersion = true;
                }

由于latestUploadDateInBLSO可以为null,该表达式如何始终为真?

4 个答案:

答案 0 :(得分:5)

由于UploadedOnDate不可为空,结果将始终为DateTime值且永不为空。如果列表为空,您将获得default(DateTime) DateTime.MinValue

如果您希望它返回null,则您需要将UploadedOnDate投放到DateTime?。如果类型可以为空,则可以省略DefaultIfEmptythe docs Max将返回null以获取空序列。

DateTime? latestUploadDateInBLSO = Documents
    .Where(d => d.DocumentLinkId == documentLinkId && d.UploadedInStage.StageNumber == 6 && d.DocumentOwnerTeam.TeamId == AuthorUser.Team.TeamId)
    .Select(d => (DateTime?)d.UploadedOnDate)
    .Max();

答案 1 :(得分:3)

如果uploadedOnDate也是DateTime类型,那么它不是NULL。 DateTime的默认值等于DateTime.MinValue。这就是为什么你的nullable总是有价值的原因。如果你想改变它,你将明确地通过DefaultIfEmpty说并返回NULL作为默认值。

答案 2 :(得分:2)

这是因为DefaultIfEmpty调用与一系列非可空元素(DateTime)结合在一起 - 你说的是从Where和{{1}返回的集合}为空,而是返回一个包含单个默认Select的集合,因此它永远不会返回DateTime

这是一个带有LINQPad输出的小样本:

null

enter image description here

答案 3 :(得分:1)

DefaultIfEmpty可能正在将DateTime对象初始化为其默认值DateTime.MinValue,因此它永远不会为null,因此HasValue将始终返回true。