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)
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)
Microsoftによって実装されていないためです。しかし、それは例えばです。 JetBrains ReSharperによって実装されています。
のReSharperは4回の警告を示しています:is
演算子はオーバーロードできません
Visual Studioは2回のコンパイラの警告を示しています。
is
オペレータは、参照コンバージョン、ボクシングコンバージョン、およびアンボックス化コンバージョンのみを考慮します。 ユーザー定義コンバージョンなどの他のコンバージョンは考慮されません。
出典:MSDN
引用されたコンテンツのために使用してください –
それはヒューリスティックだとヒューリスティックは、定義により、不完全です。
このヒューリスティックのソースコードは、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に示すように、このギャップを埋めるサードパーティのソリューションがあります。
偉大な答え:) –
これはVisual Studio内では素晴らしいですが、 'warnings as errors 'が使用されている場合、ビルドを中断しません。これを参照してください:http://stackoverflow.com/q/3361495/2557263 – Alejandro