66 messaggi dal 03 ottobre 2009
scusate mi sono "incastrato" in questo problema e non ne riesco a venire a capo, allora la struttura delle classi è la seguente (ovviamente sintetizzo al massimo):

public interface IMyInterface { }
public class MyClass : IMyInterface { }
public class MyBaseManager<T> where T : IMyInterface { }
public class MyDerivedManager : MyBaseManager<MyClass> { }

a questo punto eseguo il seguente codice:

MyDerivedManager ob1 = new MyDerivedManager();
MyBaseManager<IMyInterface> ob2 = (MyBaseManager<IMyInterface>)(object)ob1; // genera eccezione

MyDerivedManager è dunque una classe che eredita da MyBaseManager però quando cerco di fare il cast mi genera eccezione, c'è modo di convertire l'istanza ob1 in MyBaseManager<IMyInterface> ?
grazie

Andrea Restucci - Web Developer
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Andrea,
la varianza, ovvero la funzionalità che ti permetterebbe di effettuare quel casting, non è consentita su tipi concreti.

Riporto dalla documentazione:

In the .NET Framework 4, variant type parameters are restricted to generic interface and generic delegate types.


Quindi puoi crearti un'interfaccia covariante e farla implementare dal tuo MyBaseManager. Poi potrai castare ob1 su quell'interfaccia.

Ecco un esempio:
https://dotnetfiddle.net/yzjWOB

ciao,
Moreno

Enjoy learning and just keep making
66 messaggi dal 03 ottobre 2009
ok grazie, ci sono arrivato facendo un pò di ricerca in rete, comunque in quel modo (<out T>) sei un pò limitato nell'utilizzo del generic all'interno dell'interfaccia, ad esempio non puoi usarlo come parametro di un metodo, in questo caso dovresti aggiungere un altro generic <in T2> però così poi crei molta confusione nell'implementazione ...

Andrea Restucci - Web Developer

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.