aby uniknąć nieporozumień podsumowałem jakiś kod:Jak zaimplementować rodzajowy polimorfizm w języku 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)
{
}
}
}
Kiedy debugowania kodu otrzymuję InvalidCastException w Main()
.
Wiem, że ISpecificEntity
implementuje . Ale oczywiście bezpośrednia obsada od IManager<ISpecificEntity>
do IManager<IIdentifier>
nie działa.
Myślałem, że praca z kowariancją może załatwić sprawę, ale zmiana IManager<TIdentifier>
na IManager<in TIdentifier>
również nie pomaga.
Czy istnieje sposób na przeniesienie specificManager
do IManager<IIdentifier>
?
Dzięki i wszystkim, co najlepsze.
proszę przeczytać: http://stackoverflow.com/questions/245607/how-is-generic-covariance-contra-variance-implemented-in-c-sharp-4-0 –