1. ホーム
  2. c#

[解決済み] is' 対 try cast with null check

2022-09-16 03:51:04

質問

Resharperがこれを回すように提案していることに気づきました。

if (myObj.myProp is MyType)
{
   ...
}

をこの中に入れてください。

var myObjRef = myObj.myProp as MyType;
if (myObjRef != null)
{
   ...
}

なぜこのような変更を提案するのでしょうか?私はResharperが最適化の変更やコード削減の変更を提案することには慣れていますが、これは私の単一のステートメントを2行に変えようとしているように感じられるのです。

によると MSDN :

<ブロッククオート

表現 は、次の両方の条件を満たす場合に真と評価されます。 が満たされる場合、真と評価されます。

はnullではない。expressionは . つまり という形のキャスト式です。 (type)(expression) は例外を投げずに完了します。 は例外を発生させずに完了します。

私の読み違いでしょうか、それとも is は、NULLチェックのために明示的に別のローカル変数を作成する必要がなく、ただ1行で全く同じチェックを行うのでしょうか?

どのように解決するのですか?

キャストは1つだけだからです。これを比較してください。

if (myObj.myProp is MyType) // cast #1
{
    var myObjRef = (MyType)myObj.myProp; // needs to be cast a second time
                                         // before using it as a MyType
    ...
}

をこれに変更します。

var myObjRef = myObj.myProp as MyType; // only one cast
if (myObjRef != null)
{
    // myObjRef is already MyType and doesn't need to be cast again
    ...
}


C# 7.0では、よりコンパクトな構文である パターンマッチ :

if (myObj.myProp is MyType myObjRef)
{
    ...
}