2017-01-23 8 views
7

값 유형에 is을 사용할 때 Visual Studio에서 경고하는 이유는 무엇입니까? 라인 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

ReSharper에서 4 경고를 보여준다 다음 is 연산자 과부하 될 수

ReSharper

+0

Visual Studio 내에서이 기능은 훌륭하지만 '경고를 오류로 처리'하면 빌드가 중단되지 않습니다. 참조하십시오 : http://stackoverflow.com/q/3361495/2557263 – Alejandro

-1

비주얼 스튜디오 2 컴파일러 경고를 나타낸다.

is 연산자는 참조 변환, 복싱 변환 및 unboxing 변환 만 고려합니다. 사용자 정의 전환과 같은 기타 전환은 고려되지 않습니다.

자료 : MSDN

+0

인용 된 문자를 사용하십시오. –

8

그것은 경험적 그리고 추론은, 정의, 불완전.

이 추론의 소스 코드는 Roslyn Source: Binder.GetIsOperatorConstantResult에서 찾을 수 있습니다. 이 x가 null 이외의 표현이다 (당신의 예에서와 같이) 알려진 경우

// 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. 

물론, 휴리스틱을 개선 할 수있다 : 코드는 다음과 같은 인용문이 포함되어 있습니다. 그러나 Eric Lippert writes in his blog으로, 모든 경고 (사실 모든 컴파일러 기능)에는 비용이 있으며, 분명히 Roslyn 개발자는이 기능을이 릴리스에서 충분히 중요하다고 생각하지 않았습니다.

Thomas Weller's answer과 같이이 차이를 보완하는 타사 솔루션이 있습니다.

+2

위대한 답변 :) –