Это эвристический и эвристические, по определению, неполными.
Исходный код этой эвристики можно найти здесь: Roslyn Source: Binder.GetIsOperatorConstantResult. Код содержит следующую цитату:
// The result of "x is T" can be statically determined to be true if x is an expression
// of non-nullable value type T. If x is of reference or nullable value type then
// we cannot know, because again, the expression value could be null or it could be good.
Очевидно, что эвристика может быть улучшена, если это известно (как в ваших примерах), что x
является ненулевым выражением. Однако, как Eric Lippert writes in his blog, каждое предупреждение (фактически - каждая функция компилятора) имеет стоимость, и, по-видимому, разработчики Roslyn не рассматривали эту функцию достаточно важную для этой версии.
Поскольку Thomas Weller's answer показывается, есть альтернативные решения, заполняющие этот пробел.
Хотя это замечательно в Visual Studio, он не разбивает сборку, когда используется «обрабатывать предупреждения как ошибки». См. Это: http://stackoverflow.com/q/3361495/2557263 – Alejandro