Выражение 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.