将泛型转换为抽象基 - 协方差

Casting Generic to abstract base - covariance

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

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

由于您不能对抽象 class 进行逆变或协变(即 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
{       
}

这显然是在添加一个您目前没有的步骤,并且可能出于任何原因无法使用,但这是编译代码的最简单方法,我认为可以按照您的意愿进行。