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)
        {
        }
    }
}

コードをデバッグすると、でInvalidCastExceptionが発生しMain()ます。

私はそれがISpecificEntity実装していることを知っていますIIdentifierIManager<ISpecificEntity>しかし、明らかに、からへの直接キャストIManager<IIdentifier>は機能しません。

共分散で作業することでうまくいくと思いましたが、に変更IManager<TIdentifier>IManager<in TIdentifier>ても役に立ちません。

だから、キャストする方法はありspecificManagerますIManager<IIdentifier>か?

ありがとう、そしてすべての最高。

4

2 に答える 2

7

あなたと一緒IManager<IIdentifier>にそのようなことをすることができます:

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

SpecificEntityManagerタイプのパラメータのみを受け入れるため、例外が発生します。ISpecificEntity

更新:C#の共変性と反変性について詳しくは、EricLippertのブログをご覧ください。

于 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 に答える