在一个可空的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对象上使用ToShortDateString()方法的一些问题,为什么?

你是对的,这是因为你的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()。它还使用新的实现覆盖此方法。如果hasValuefalse,则返回"",如果hasValuetrue,则返回从.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() : ""

相关文章:
  • 没有找到相关文章