我有一个实现接口的类如下:
public class Database : IStore
在另一个类中,我有以下成员变量;并在运行时动态地为其分配一个Database实例:
private IStore store;
以及对store变量进行类型检查的方法,如下所示:
if (store is Database)
ReSharper声称这种情况总是错误的。此外,它声称“存储为数据库”将始终为空。这是为什么?检查此接口类型成员持有的运行时对象类型的最佳方法是什么?是否可能只是说'可能不是真的'总是或者真的它永远不会是'?
答案 0 :(得分:4)
听起来R#很困惑,或你有两种不同的IStore
类型,当你实际上这个类实现了不同的类型时,你正在测试它。 (当然,还是两种不同的Database
类型。可能性相同。)
您是否能够制作一个简短而完整的示例来说明问题?如果您将IStore
/ Database
运算符悬停在代码中的as
和is
上,它是否会显示您期望的完全限定类型名称?如果您运行代码, 它是否会进入if
正文?
答案 1 :(得分:2)
ReSharper显然是错的;问题是为什么。它可能是错误地解决了类型。
您的项目目前是否正在编译?分析错误的代码很困难,我们的代码在编辑时经常处于不正确的状态。我最近发现ReSharper的几个案例给出了类似的错误类型错误(例如“不能隐式地将String转换为Object”)。在我获得编译解决方案中的所有项目之后,它就消失了。
另一种可能性:你有一个隐藏类的字段store
的局部变量store
。要检查这一点,您可以将代码更改为
if (this.store is Database)
您还可以尝试使用ReSharper的导航转到store
和Database
的声明,看看它是否会将您带到预期的位置。
答案 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();
}
}