2012-04-18 11 views
5

私はいくつかのコードを要約:C#で一般的な多型を実装する方法は?混乱を避けるために

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が得られます。

ISpecificEntityIIdentifierを実装しています。 しかし、明らかにIManager<ISpecificEntity>からIManager<IIdentifier>への直接キャストは機能しません。

私は共分散を使って作業することはできますが、IManager<TIdentifier>IManager<in TIdentifier>に変更することは役に立たないと思いました。

したがって、specificManagerIManager<IIdentifier>にキャストする方法はありますか?

ありがとうございました。 IManager<IIdentifier>

+0

お読みください:http://stackoverflow.com/questions/245607/how-is-generic-covariance-contra-variance-implemented-in-c-sharp-4-0 –

答えて

7

あなたがそのようなことを行うことができます:それは種類のパラメータのみを受け入れるため、

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

あなたSpecificEntityManagerで、例外につながるISpecificEntity

UPDATE: あなたは共分散についての詳細を読むことができますC#の反動はEric Lippert's blog

+0

...それが理由ですOPがやりたいことをすることは許されません。 +1 –

+0

@DanielHilgarth正確に:) –

+0

しかし、 'ISpecificEntity'は' IIdentifier'を実装しています。そして 'IManager'の' TIdentifier'は 'IIdentifier'だけを受け入れます。したがって、その行には例外はありません。私が間違っている? – Palama

2

なぜか:

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

+0

'SpecificEntity'は' IManager 'ではなく' IIdentifier'です。 – Palama

関連する問題