Вопрос по оператору `is`

Почему в примере ниже Foo1 возвращает true, а Foo2 возвращает false?

static bool Foo1<T>(T v) => v is var b;
static bool Foo2<T>(T v) => v is T b;

static void Main(string[] args)
{
   int? i = null;
   bool f1 = Foo1(i);
   bool f2 = Foo2(i);
}

Ответы (1 шт):

Автор решения: CrazyElf

"Шаблон var используется для сопоставления любого выражения, в том числе null и назначения результата новой локальной переменной."

То есть фактически is var всегда будет равен True. Он ничего не проверяет, а просто создаёт временную переменную.

А во втором случае null это не int, поэтому будет False. При сопоставлении x is T, где T - это конкретный тип, случай, когда x - это null, обрабатывается отдельно. null не сопоставляется ни с каким конкретным типом, даже если этот тип Nullable. В случае null такое сопоставление не срабатывает и возвращается False.

→ Ссылка