2017-01-23 7 views
7

Почему Visual Studio предупреждает об этом при использовании is по типам значений, но не относится ли это к ссылочным типам? Строки 1 и 2 поднимают предупреждение, а строки 3 и 4 - нет.Данное выражение всегда относится к предоставленному типу

if (5 is object) 
if (new Point() is object) 

if ("12345" is object) 
if (new StringBuilder() is object) 

ответ

4

Потому что он не был реализован Microsoft. Но это, например, реализованном JetBrains ReSharper.

Visual Studio показывает 2 предупреждений компилятора:

Visual Studio

ReSharper показывает 4 предупреждения:

ReSharper

+0

Хотя это замечательно в Visual Studio, он не разбивает сборку, когда используется «обрабатывать предупреждения как ошибки». См. Это: http://stackoverflow.com/q/3361495/2557263 – Alejandro

-1

Оператор is не может быть перегружен.

Обратите внимание, что оператор is учитывает только обратные преобразования, преобразования бокса и преобразования распаковки. Другие конверсии, такие как пользовательских конверсий, не учитываются.

Источник: MSDN

+0

Пожалуйста, используйте символ цитирования> для цитируемого контента –

8

Это эвристический и эвристические, по определению, неполными.

Исходный код этой эвристики можно найти здесь: 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 показывается, есть альтернативные решения, заполняющие этот пробел.

+2

Отличный ответ :) –