为避免混淆,我总结了一些代码:

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#中协方差和协方差的更多信息

10-06 00:39