【发布时间】:2010-09-08 09:16:15
【问题描述】:
我为我们的项目添加了一个协变接口:
interface IView
{
}
interface IPresenter<out TView> where TView : IView
{
TView View { get; }
}
我创建了一些类,实现了这些接口:
class TestView : IView
{
}
class TestPresenter : IPresenter<TestView>
{
public TestView View
{
get { return something; }
}
private void DoSomething()
{
}
}
我可以毫无问题地使用它:
IPresenter<IView> presenter = new TestPresenter();
所以一切似乎都是正确的,所以我假设我的协方差使用是正确的。不幸的是,我们的单元测试项目包含来自同一项目中某些类型的私有访问器,例如协变接口,这会导致构建失败。
无法加载类型 'GenericInheritanceTest.IPresenter_Impl`1' 从组装 'GenericInheritanceTest_Accessor, 版本=0.0.0.0,文化=中性, PublicKeyToken=null' 因为它 声明协变或逆变 类型参数并且不是接口 或委托。
这里到底有什么问题?我的实施是否有失败,分别。如何解决这个问题?不可能,一旦我们使用协变类型,我们就必须避免访问器???是否可以阻止为某些类型创建访问器来解决这个问题?
【问题讨论】:
-
一般情况下,您应该避免使用私有访问器 - 它们会导致测试和生产代码之间的耦合过紧。
-
是的,谢谢,但是我这里有一个已经存在的项目,它有 120k loc 并且很好地使用了私有访问器,所以重做它不仅仅是指尖。
标签: c# unit-testing covariance accessor