per evitare confusione ho riassunto po 'di codice:Come implementare il polimorfismo generico in 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)
{
}
}
}
Quando il debug del codice ottengo un InvalidCastException in Main()
.
So che ISpecificEntity
implementa IIdentifier
. Ma ovviamente un cast diretto da IManager<ISpecificEntity>
in un IManager<IIdentifier>
non funziona.
Ho pensato che lavorare con la covarianza poteva fare il trucco ma cambiare IManager<TIdentifier>
in IManager<in TIdentifier>
non aiuta neanche.
Quindi, c'è un modo per trasmettere specificManager
in un IManager<IIdentifier>
?
Grazie e tutto il meglio.
leggere: http://stackoverflow.com/questions/245607/how-is-generic-covariance-contra-variance-implemented-in-c-sharp-4-0 –