在一个可空的DateTime对象上使用ToShortDateString()方法的一些问题,为什么?
本文关键字:ToShortDateString 方法 为什么 问题 对象 一个 DateTime | 更新日期: 2023-09-27 18:15:45
我有以下问题:
在类中声明:
vulnerabilityDetailsTable.AddCell(new PdfPCell(new Phrase(currentVuln.Published.ToString(), _fontNormale)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 30, PaddingTop = 10 });
和有趣的部分是:currentVuln.Published.ToString()。
Published是一个DateTime属性,声明为可空,如下所示:
public System.DateTime? Published { get; set; }
问题是,在以前的方式中,currentVuln.Published.ToString()的打印值类似于18/07/2014 00:00:00(时间也包含在日期中)。
我想只显示日期而不显示时间,所以我试着用这样的东西:
currentVuln.Published.ToShortDateString()
但它不起作用,我在Visual Studio中获得以下错误信息:
错误4 'System.Nullable
'不包含定义'ToShortDateString',没有扩展方法'ToShortDateString'接受类型的第一个参数可以找到'System.Nullable '(您是否缺少一个使用指令或程序集参考?)C:'Develop'EarlyWarning'public'Implementazione'Ver2'PdfReport'PdfVulnerability.cs 93 101 PdfReport
这似乎是因为我的DateTime字段是可空的。
我错过了什么?我如何解决这个问题?
你是对的,这是因为你的DateTime
字段是可空的。
DateTime
的扩展方法对于DateTime?
是不可用的,但是要理解为什么,您必须意识到实际上没有DateTime?
类。
最常见的是,我们使用?
语法编写可空类型,如DateTime?
、int?
等。但这只是Nullable<DateTime>
、Nullable<int>
等的语法糖。
public Nullable<DateTime> Published { get; set; }
所有这些明显分开的Nullable
类型都来自一个通用的Nullable<T>
结构体,它包装了你的类型并提供了两个有用的属性:
-
HasValue
(用于测试底层包装类型是否有值),和 -
Value
(用于访问底层值,假设有一个)
首先检查以确保有一个值,然后使用Value
属性来访问底层类型(在本例中是DateTime
),以及该类型通常可用的任何方法。
if (currentVuln.Published.HasValue)
{
// not sure what you're doing with it, so I'll just assign it...
var shortDate = currentVuln.Published.Value.ToShortDateString();
}
对于c# 6.0及更高版本,可以使用null条件代替.Value
:
var shortDate = currentVuln.Published?.ToShortDateString();
以防其他人遇到这个线程。你可以使用。value. toshortdatestring()。
值类型Nullable<>
将另一种值类型的值与布尔值hasValue
封装在一起。
类型Nullable<>
从它的最终基类System.Object
继承了方法string ToString()
。它还使用新的实现覆盖此方法。如果hasValue
是false
,则返回""
,如果hasValue
是true
,则返回从.ToString()
获得的封装值(也继承了System.Object
)的字符串。
这就是为什么你现有的代码是合法的。
但是,类型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;
,并使用它:published.HasValue ? published.Value.ToShortDateString() : ""