Что касается проверки типа, у нас есть один оператор, который эффективно делает две вещи одновременно:

if (GetObject() is DateTimeOffset dto)
{
   // use dto here
}

Не только dto в этом примере имеет определенный тип DateTimeOffset, но и значение является локальным, и оно полностью оценивается.

Итак, предоставляет ли C # 8.0 аналогичный оператор для проверки ненулевых значений?

if (GetPossibleNull() is not null x)
{
  // x is local, evaluated and guaranteed to be not-null
}
1
astrowalker 12 Фев 2020 в 09:55

2 ответа

Лучший ответ

Вы можете использовать пустой шаблон свойств ({}), чтобы проверить, что переменная не является null

if (GetPossibleNull() is {} x)
{
  // x is local, evaluated and guaranteed to be not-null
}
4
Pretasoc 12 Фев 2020 в 07:02

Выражение x is T y также проверяет значения null всех типов (ссылочные типы и Nullable<T>), даже если x уже статически типизирован как T - и это работает в C # 7.0:

class Foobar {}

static Foobar GetPossibleNull() { return null; }

static void Main()
{
    if( GetPossibleNull() is Foobar foobar )
    {
        Console.WriteLine( "GetPossibleNull() returned a non-null value." );    
    }
    else
    {
        Console.WriteLine( "GetPossibleNull() returned null." );
    }
}

Когда я запускаю эту программу, я вижу «GetPossibleNull () вернул null» в окне консоли.

Эти изменения также работают как и ожидалось в C # 7.3 (у меня нет доступа к компилятору C # 8.0 прямо сейчас):

static Nullable<Int32> GetNullInt32() => null;
static Nullable<Int32> GetNonNullInt32() => 123;

static void Main()
{
    if( GetNullInt32() is Int32 nonNullInt )
    {
        Console.WriteLine( "GetNullInt32() returned a non-null value." );    
    }
    else
    {
        Console.WriteLine( "GetNullInt32() returned null." );
    }

    if( GetNonNullInt32() is Int32 nonNullInt )
    {
        Console.WriteLine( "GetNonNullInt32() returned a non-null value." );    
    }
    else
    {
        Console.WriteLine( "GetNonNullInt32() returned null." );
    }
}

Выходы:

GetNullInt32() returned null.

GetNonNullInt32() returned a non-null value.
1
Dai 12 Фев 2020 в 07:07