我有以下问题。
在课堂上我宣布:
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字段可以为空。
我缺少什么?我该如何解决这个问题?
答案 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;