在 C#/dotnet 中将可空变量转换为不可空变量

lcj*_*lcj 0 c# .net-core

这听起来微不足道,但我面临挑战。我无法将可为空值转换为不可为空值:

if (caseObj.SyncDate != null)
    caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(caseObj.SyncDate);
Run Code Online (Sandbox Code Playgroud)

我的 caseObj.SyncDate 定义为:

public DateTimeOffset? SyncDate {get;set;}
Run Code Online (Sandbox Code Playgroud)

我的 getFormattedDateTime 是:

    public static string getFormattedDateTime(DateTimeOffset dateTimeOffset) {

        string returnDate = null;

        if (dateTimeOffset != null) {
            returnDate = dateTimeOffset.ToString("yyyy-MM-dd HH:mm:ss.fffzzz", CultureInfo.InvariantCulture);
        }
        return returnDate;
    }
Run Code Online (Sandbox Code Playgroud)

我读过这篇文章并尝试过:

        if (caseObj.SyncDate != null)
            caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(caseObj.SyncDate!):
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,因为我看到了Microsoft 文档的链接,其中指出:

有时,当您知道变量不为 null,但编译器确定其 null 状态为 Maybe-null 时,您必须覆盖警告。您使用了 null-forgiving 运算符!跟随变量名称以强制空状态为非空。例如,如果您知道 name 变量不为 null,但编译器发出警告,则可以编写以下代码来覆盖编译器的分析:

但这似乎不起作用。我已经阅读了这篇文章(我认为这篇文章足够集中),而这篇文章的标记解决方案不是从可为空转换为空。

我也尝试过这个:

        if (caseObj.SyncDate != null) {
            DateTimeOffset dto = (DateTimeOffset) caseObj.SyncDate;
            caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(dto);
        }
Run Code Online (Sandbox Code Playgroud)

但得到这个:

参数 1:无法从“System.DateTimeOffset”转换?到“系统.日期时间”

这很奇怪,因为我没有尝试从 System.DateTimeOffset 进行转换?到系统日期时间。我正在尝试转换 System.DateTimeOffset?到日期时间偏移。

我在 Mac 上运行 dotnet core(版本 6.0.201)。似乎有一些冗长复杂的答案,但我认为有一种简单的方法可以做到这一点,但我缺少。

小智 5

如果我没猜错的话 - 你可能想要这样的东西:

if (caseObj.SyncDate.HasValue)
    caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(caseObj.SyncDate.Value);
Run Code Online (Sandbox Code Playgroud)