3

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

public class Database : IStore

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

private IStore store;

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

if (store is Database)

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

4

4 回答 4

4

这听起来像是 R# 被混淆了,或者您有两种不同的IStore类型,并且您正在针对一种进行测试,而实际上该类实现了不同的类型。(当然也可以是两种不同Database的类型。可能性是等价的。)

你能提供一个简短但完整的例子来说明这个问题吗?如果您将鼠标悬停在带有/运算符IStore的代码中,它是否会显示您期望的完全限定类型名称?如果你运行代码,会进入正文吗?Databaseasisif

于 2012-09-05T16:54:58.700 回答
2

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

你的项目现在编译了吗?分析不正确的代码很困难,而且我们的代码在我们编辑它时经常处于不正确的状态。我最近发现了几个 ReSharper 给出类似错误类型错误的案例(例如“无法将字符串隐式转换为对象”)。在我得到解决方案中的所有项目进行编译后,它就消失了。

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

if (this.store is Database)

您还可以尝试使用 ReSharper 的导航转到store和 of的声明Database,看看它是否会将您带到预期的地方。

于 2012-09-05T16:56:51.480 回答
1

我的猜测是,您在某个地方还有另一个名为 Database 的类。将鼠标悬停在“is Database”上并确保它是正确的命名空间。如果不是,则明确使用所需数据库的整个命名空间。

于 2012-09-05T16:56:47.137 回答
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();
    }
}
于 2012-09-05T17:02:47.657 回答