将泛型转换为抽象基 - 协方差
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 进行逆变或协变(即 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
{
}
这显然是在添加一个您目前没有的步骤,并且可能出于任何原因无法使用,但这是编译代码的最简单方法,我认为可以按照您的意愿进行。
下面的代码给出了编译时错误:
错误 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 进行逆变或协变(即 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
{
}
这显然是在添加一个您目前没有的步骤,并且可能出于任何原因无法使用,但这是编译代码的最简单方法,我认为可以按照您的意愿进行。