Мне кажется, что оператор is немного несогласован.
bool Test()
{
// Returns false, but should return true.
return null is string;
}
Ожидается, что значение null принадлежит любому ссылочному (или нулевому) типу. И действительно, спецификация языка С# говорит то, что поддерживает эту гипотезу, например (6.1.6 Неявные ссылки):
Неявные ссылочные преобразования:
...
• От нулевого литерала до любого ссылочного типа.
Описание (7.10.10 Оператор is) оператора is начинается тем, что выражение (E is T) приведет к истине, когда существует ссылочное преобразование от E до T, но затем авторы продолжайте, явно исключая случай, когда E является литералом null или имеет значение null.
Почему они это делают? Для меня это кажется противоречивым.