如何在c#中实现泛型多态?

Pal*_*ama 5 c# generics inheritance casting covariance

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

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)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我调试代码时,我得到一个InvalidCastException Main().

我知道那个ISpecificEntity工具IIdentifier.但显然从一个直接演员IManager<ISpecificEntity>到一个IManager<IIdentifier>不起作用.

我以为与协工作可以做的伎俩,但改变IManager<TIdentifier>IManager<in TIdentifier>也没有帮助.

那么,有没有办法specificManager投入IManager<IIdentifier>

谢谢,一切顺利.

Ser*_*kiy 7

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

IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);
Run Code Online (Sandbox Code Playgroud)

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

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