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内では素晴らしいですが、 'warnings as errors 'が使用されている場合、ビルドを中断しません。これを参照してください:http://stackoverflow.com/q/3361495/2557263 – Alejandro

-1

Visual Studioは2回のコンパイラの警告を示しています。

isオペレータは、参照コンバージョン、ボクシングコンバージョン、およびアンボックス化コンバージョンのみを考慮します。 ユーザー定義コンバージョンなどの他のコンバージョンは考慮されません。

出典: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

偉大な答え:) –

関連する問題