Есть ли оператор «проверить и получить» против not-null в C# 8.0? - PullRequest
1 голос
/ 12 февраля 2020

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

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

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

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

if (GetPossibleNull() is not null x)
{
  // x is local, evaluated and guaranteed to be not-null
}

Ответы [ 2 ]

4 голосов
/ 12 февраля 2020

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

if (GetPossibleNull() is {} x)
{
  // x is local, evaluated and guaranteed to be not-null
}
1 голос
/ 12 февраля 2020

Выражение 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 () вернул ноль» в окне консоли.

Эти варианты также работают, как и ожидалось, в 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...