Мне кажется, что оператор 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
.
Почему они это делают? Для меня это кажется противоречивым.