在可以为空的DateTime对象上使用ToShortDateString()方法的一些问题,为什么?

时间:2014-07-31 14:01:13

标签: c# asp.net .net datetime

我有以下问题。

在课堂上我宣布:

vulnerabilityDetailsTable.AddCell(new PdfPCell(new Phrase(currentVuln.Published.ToString(), _fontNormale)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 30, PaddingTop = 10 });

而有趣的部分是: currentVuln.Published.ToString()。这很好。

已发布是一个 DateTime 属性,声明为可以为空,这样:

public System.DateTime? Published { get; set; }

问题在于,以前的方式 currentVuln.Published.ToString()的打印值类似于 18/07/2014 00:00:00 (时间也包含在日期中。

我想只显示日期而不显示时间,所以我尝试使用类似的东西:

currentVuln.Published.ToShortDateString()

但它不起作用,我在Visual Studio中获得以下错误消息:

  

错误4' System.Nullable< System.DateTime>'不包含   定义' ToShortDateString'没有扩展方法   ' ToShortDateString'接受第一个类型的参数   '&System.Nullable LT; System.DateTime的>'可以找到(你错过了吗?   使用指令或程序集   参考?)C:\ Develop \ EarlyWarning \ public \ Implementazione \ Ver2 \ PdfReport \ PdfVulnerability.cs 93 101 PdfReport

似乎发生这种情况是因为我的DateTime字段可以为空。

我缺少什么?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:11)

你是对的,因为你的DateTime字段可以为空。

DateTime的{​​{1}}扩展方法不可用,但为了理解原因,您必须意识到实际上没有DateTime?类。

最常见的是,我们使用DateTime?语法编写可空类型,如?DateTime?等,如上所述。但int?Nullable<DateTime>等只是syntactic sugar

Nullable<int>

所有那些明显不同的public Nullable<DateTime> Published { get; set; } 类型来自单个generic Nullable<T> struct,它包含您的类型并提供两个有用的属性:

  • Nullable(用于测试底层包装类型是否具有值)和
  • HasValue(用于访问该基础值,假设有一个)

检查以确保首先出现sa值,然后使用Value属性访问基础类型(在本例中为Value),以及通常可用的任何方法对于那种类型。

DateTime

答案 1 :(得分:2)

值类型Nullable<>封装了另一个值类型的值以及布尔值hasValue

此类型Nullable<>从其最终基类string ToString()继承方法System.Object。它还使用新实现覆盖此方法。如果""hasValue,则新实现返回false,并返回从.ToString()获取的封装值(也继承System.Object)的字符串{} {1}}是hasValue

这就是您现有代码合法的原因。

true类型没有任何方法Nullable<>。您必须通过ToShortDateString属性转到封装的值。因此,而不是非法:

Value

你需要

currentVuln.Published.ToShortDateString()    /* error */

或等同于

currentVuln.Published.HasValue ? currentVuln.Published.Value.ToShortDateString() : ""

(两者在运行时都这样做)。如果您愿意,可以将字符串currentVuln.Published != null ? currentVuln.Published.Value.ToShortDateString() : "" 更改为其他内容,例如"""never"

如果问题是"not published"属性(其Published访问者)被调用两次,则需要在某处取出临时变量get,并使用该变量:var published = currentVuln.Published;