5

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

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().

我知道ISpecificEntity实现IIdentifier. 但显然从 an 直接IManager<ISpecificEntity>转换为 anIManager<IIdentifier>是行不通的。

我认为使用协方差可以解决问题,但更改IManager<TIdentifier>IManager<in TIdentifier>也无济于事。

那么,有没有办法强制specificManager转换成IManager<IIdentifier>?

谢谢,一切顺利。

4

2 回答 2

7

有了IManager<IIdentifier>你可以做这样的事情:

IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);

这将在您的 , 中导致异常,SpecificEntityManager因为它只接受类型的参数ISpecificEntity

更新:您可以在Eric Lippert 的博客中阅读有关 C# 中协变和逆变的更多信息

于 2012-04-18T14:11:06.360 回答
2

为什么不:

ISpecificEntity bankAccountManager = new SpecificEntity();
IManager<IIdentifier> manager = (IManager<IIdentifier>)bankAccountManager;
manager.DoStuffWith(new SpecificEntity());

?

于 2012-04-18T14:32:47.863 回答