将Generic转换为抽象基数 - 协方差

时间:2015-01-18 22:59:33

标签: c# generics covariance contravariance

下面的代码给出了编译时错误:

错误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>
    {
    }
}   

1 个答案:

答案 0 :(得分:2)

由于您无法在抽象类上进行逆变或协同(即inout),因此您可能需要为您的侦听器提供接口。修改上面的内容使其可以编译(注意未提及的实体与原始代码保持一致 - 剥离属性以节省我在测试时需要导入引用):

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
{       
}

这显然是添加了一个你目前没有的步骤,可能因为某些原因而无法使用,但这是获得代码编译的最简单方法,我认为你可以做你想要的。