为避免混淆,我总结了一些代码:
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
IManager<ISpecificEntity> specificManager = new SpecificEntityManager();
IManager<IIdentifier> manager = (IManager<IIdentifier>) specificManager;
manager.DoStuffWith(new SpecificEntity());
}
}
internal interface IIdentifier
{
}
internal interface ISpecificEntity : IIdentifier
{
}
internal class SpecificEntity : ISpecificEntity
{
}
internal interface IManager<TIdentifier> where TIdentifier : IIdentifier
{
void DoStuffWith(TIdentifier entity);
}
internal class SpecificEntityManager : IManager<ISpecificEntity>
{
public void DoStuffWith(ISpecificEntity specificEntity)
{
}
}
}
当我调试代码时,我在
Main()
中得到一个InvalidCastException。我知道
ISpecificEntity
实现了IIdentifier
。但是很明显,从
IManager<ISpecificEntity>
直接转换为IManager<IIdentifier>
是行不通的。我以为使用协方差可以解决问题,但将
IManager<TIdentifier>
更改为IManager<in TIdentifier>
也无济于事。那么,有没有一种方法可以将
specificManager
转换为IManager<IIdentifier>
呢?谢谢,祝一切顺利。
最佳答案
使用IManager<IIdentifier>
,您可以执行以下操作:
IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);
这将导致
SpecificEntityManager
中的异常,因为它仅接受ISpecificEntity
类型的参数更新:
您可以在Eric Lippert's blog上阅读有关C#中协方差和协方差的更多信息