下面的代码给出了编译时错误:
错误170无法将类型'Tests.ChangeListener'转换为'Tests.BaseListener'
如何编译?
namespace Tests
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void ShouldCompile()
{
BaseListener<IChange> listener = (BaseListener<IChange>)new ChangeListener();
}
}
public interface IChange
{
}
public interface ISpecificChange : IChange
{
}
public abstract class BaseListener<T>
where T : IChange
{
}
public class ChangeListener : BaseListener<ISpecificChange>
{
}
}
答案 0 :(得分:2)
由于您无法在抽象类上进行逆变或协同(即in
和out
),因此您可能需要为您的侦听器提供接口。修改上面的内容使其可以编译(注意未提及的实体与原始代码保持一致 - 剥离属性以节省我在测试时需要导入引用):
public class UnitTest1
{
public void ShouldCompile()
{
IListener<IChange> listener = new ChangeListener();
}
}
public interface IListener<out T> {}
public abstract class BaseListener<T> : IListener<T>
where T : IChange
{
}
这显然是添加了一个你目前没有的步骤,可能因为某些原因而无法使用,但这是获得代码编译的最简单方法,我认为你可以做你想要的。