Convert a nullable to a non-nullable variable in C#/dotnet

lcj

This sounds trivial but I am having challenge. I cannot convert a nullable to a non-nullable value:

if (caseObj.SyncDate != null)
    caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(caseObj.SyncDate);

Where my caseObj.SyncDate is defined as:

public DateTimeOffset? SyncDate {get;set;}

And my getFormattedDateTime is:

    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;
    }

I read this and tried:

        if (caseObj.SyncDate != null)
            caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(caseObj.SyncDate!):

Which seems strange since I saw this link to Microsoft documentation which states:

Sometimes you must override a warning when you know a variable isn't null, but the compiler determines its null-state is maybe-null. You use the null-forgiving operator ! following a variable name to force the null-state to be not-null. For example, if you know the name variable isn't null but the compiler issues a warning, you can write the following code to override the compiler's analysis:

But that didn't seem to work. I have read this post (which I thought was focused enough) and this one for which the marked solution was not to convert from nullable to null.

I have tried this as well:

        if (caseObj.SyncDate != null) {
            DateTimeOffset dto = (DateTimeOffset) caseObj.SyncDate;
            caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(dto);
        }

But get this:

Argument 1: cannot convert from 'System.DateTimeOffset?' to 'System.DateTime'

Which is strange because I am not trying to convert from System.DateTimeOffset? to System.DateTime. I am trying to convert System.DateTimeOffset? to DateTimeOffset.

I'm running dotnet core on a Mac (version 6.0.201). There seem to be some long complicated answers, but I assume there is a simple way to do this that I'm missing.

Olivier Jacot-Descombes

By using pattern matching, you can write:

if (caseObj.SyncDate is { } syncDate) {
    caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(syncDate);
}

or

if (caseObj.SyncDate is DateTimeOffset syncDate) {
    caseDTO.SyncDate = DateTimeHelper.getFormattedDateTime(syncDate);
}

{ } is an empty property pattern which implicitly tests for not null. The result, a non-nullable DateTimeOffset is assigned to a new variable syncDate if the condition succeeds.

The second version uses a type pattern which tests whether the value is a DateTimeOffset. It only succeeds if the value is not null. null has no type and never satisfies a type test.

The nice thing about a pattern matching approach is that it does three things:

  1. it tests a condition
  2. it creates a local variable
  3. it casts the input value to the result type (DateTimeOffset? to DateTimeOffset in this case).

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

TOP Ranking

  1. 1

    Failed to listen on localhost:8000 (reason: Cannot assign requested address)

  2. 2

    Loopback Error: connect ECONNREFUSED 127.0.0.1:3306 (MAMP)

  3. 3

    How to import an asset in swift using Bundle.main.path() in a react-native native module

  4. 4

    pump.io port in URL

  5. 5

    Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext

  6. 6

    BigQuery - concatenate ignoring NULL

  7. 7

    ngClass error (Can't bind ngClass since it isn't a known property of div) in Angular 11.0.3

  8. 8

    ggplotly no applicable method for 'plotly_build' applied to an object of class "NULL" if statements

  9. 9

    Spring Boot JPA PostgreSQL Web App - Internal Authentication Error

  10. 10

    How to remove the extra space from right in a webview?

  11. 11

    java.lang.NullPointerException: Cannot read the array length because "<local3>" is null

  12. 12

    Jquery different data trapped from direct mousedown event and simulation via $(this).trigger('mousedown');

  13. 13

    flutter: dropdown item programmatically unselect problem

  14. 14

    How to use merge windows unallocated space into Ubuntu using GParted?

  15. 15

    Change dd-mm-yyyy date format of dataframe date column to yyyy-mm-dd

  16. 16

    Nuget add packages gives access denied errors

  17. 17

    Svchost high CPU from Microsoft.BingWeather app errors

  18. 18

    Can't pre-populate phone number and message body in SMS link on iPhones when SMS app is not running in the background

  19. 19

    12.04.3--- Dconf Editor won't show com>canonical>unity option

  20. 20

    Any way to remove trailing whitespace *FOR EDITED* lines in Eclipse [for Java]?

  21. 21

    maven-jaxb2-plugin cannot generate classes due to two declarations cause a collision in ObjectFactory class

HotTag

Archive