3

次のようなインターフェイスを実装するクラスがあります。

public class Database : IStore

別のクラスには、次のメンバー変数があります。データベースのインスタンスは、実行時に動的に割り当てられます。

private IStore store;

次のようにストア変数の型チェックを行うメソッド:

if (store is Database)

ReSharper は、条件が常に false になると主張しています。また、「データベースとして保存」は常にnullになると主張しています。何故ですか?このインターフェイス型メンバーが保持する実行時オブジェクト型を確認する最善の方法は何ですか? これは常に「真実ではないかもしれない」と言っているだけなのか、それとも「決して真実ではない」と本当に言っているのでしょうか?

4

4 に答える 4

4

R# が混乱しているか、2つの異なるIStore型があり、実際にはクラスが別の型を実装しているときに 1 つに対してテストしているようです。(または、もちろん 2 つの異なるDatabaseタイプ。可能性は同等です。)

問題を示す短いが完全な例を作成できますか? /演算子を使用してコードにカーソルを合わせるIStoreと、期待どおりの完全修飾型名が表示されますか? コードを実行すると、体内に入りますか?Databaseasisif

于 2012-09-05T16:54:58.700 に答える
2

ReSharperは明らかに間違っています。問題はその理由です。タイプが正しく解決されていない可能性があります。

あなたのプロジェクトは現在コンパイルされていますか?誤ったコードを分析することは困難であり、編集中にコードが誤った状態になることがよくあります。最近、ReSharperで同様の誤ったタイプエラーが発生するケースがいくつか見つかりました(「文字列をオブジェクトに暗黙的に変換できない」など)。ソリューション内のすべてのプロジェクトをコンパイルするようにした後、それはなくなりました。

store別の可能性:クラスのフィールドを隠しているローカル変数がありますstore。これを確認するには、コードを次のように変更します

if (this.store is Database)

また、ReSharperのナビゲーションを使用して、storeおよびの宣言に移動しDatabase、期待される場所に移動するかどうかを確認することもできます。

于 2012-09-05T16:56:51.480 に答える
1

私の推測では、どこかにDatabaseという別のクラスがあります。'is Database'にカーソルを合わせ、それが正しい名前空間であることを確認します。そうでない場合は、必要なデータベースの名前空間全体を明示的に使用します。

于 2012-09-05T16:56:47.137 に答える
0

このコードでは、Resharper は条件が常に false であるとは言いません。

public interface IStore
{

}

public class Database:IStore
{

}

public class TestClass
{
    private readonly IStore _store;

    public TestClass(IStore store)
    {
        _store = store;
    }

    public void SomeMethod()
    {
        if(_store is Database)
            return;
        throw new NotImplementedException();
    }
}
于 2012-09-05T17:02:47.657 に答える