C#和ReSharper:检查对象的类型

时间:2012-09-05 16:52:10

标签: c# interface resharper instanceof implements

我有一个实现接口的类如下:

public class Database : IStore

在另一个类中,我有以下成员变量;并在运行时动态地为其分配一个Database实例:

private IStore store;

以及对store变量进行类型检查的方法,如下所示:

if (store is Database)

ReSharper声称这种情况总是错误的。此外,它声称“存储为数据库”将始终为空。这是为什么?检查此接口类型成员持有的运行时对象类型的最佳方法是什么?是否可能只是说'可能不是真的'总是或者真的它永远不会是'?

4 个答案:

答案 0 :(得分:4)

听起来R#很困惑,你有两种不同的IStore类型,当你实际上这个类实现了不同的类型时,你正在测试它。 (当然,还是两种不同的Database类型。可能性相同。)

您是否能够制作一个简短而完整的示例来说明问题?如果您将IStore / Database运算符悬停在代码中的asis上,它是否会显示您期望的完全限定类型名称?如果您运行代码, 它是否会进入if正文?

答案 1 :(得分:2)

ReSharper显然是错的;问题是为什么。它可能是错误地解决了类型。

您的项目目前是否正在编译?分析错误的代码很困难,我们的代码在编辑时经常处于不正确的状态。我最近发现ReSharper的几个案例给出了类似的错误类型错误(例如“不能隐式地将String转换为Object”)。在我获得编译解决方案中的所有项目之后,它就消失了。

另一种可能性:你有一个隐藏类的字段store的局部变量store。要检查这一点,您可以将代码更改为

if (this.store is Database)

您还可以尝试使用ReSharper的导航转到storeDatabase的声明,看看它是否会将您带到预期的位置。

答案 2 :(得分:1)

我的猜测是你有另一个叫做数据库的类。将鼠标悬停在'is Database'上并确保它是正确的命名空间。如果不是,则明确地使用您想要的数据库的整个命名空间。

答案 3 :(得分:0)

在这段代码中,Resharper并没有说条件总是假的。

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();
    }
}