Ho una classe generica con una sottoclasse che fornisce tipi specifici.Puoi creare una sottoclasse di una classe generica con una classe tipizzata specifica?
public abstract class GenericBase<T>
where T:Interface1
{
}
ho sottoclasse i farmaci generici con le implementazioni specifiche:
public class Customer:
GenericBase<Type1>
(Type1
attrezzi Interface1
).
Ho un'altra classe di base astratta che ha un riferimento alla presente:
protected GenericBase<Interface1> genericInstance;
Infine, quando si tenta di assegnare il genericInstance a un'istanza della classe base, mi dà un errore del compilatore, dicendo che "Impossibile convertire implicitamente il cliente in GenericBase <Interface1>".
base.genericInstance = new Customer(); //Compiler error
non capisco perché dovrei ottenere questo errore se Customer
è un sottotipo di GenericBase<Type1>
, e Type1
implementa Interface1
. Customer
è effettivamente un tipo di GenericBase<Interface1>
, se è una sottoclasse di GenericBase<Type1>
?
Presumo che io stia fraintendendo qualcosa sui generici qui; c'è un modo per consentire questo comportamento?
Non sono sicuro in C#, ma questo sicuramente non funziona in Java. In Java, 'genericInstance' dovrebbe essere dichiarato come' GenericBase protetto estende Interface1> genericInstance' (nota: non l'ho provato per vedere se effettivamente funziona). – Powerlord
[Covarianza e contro-varianza] (https://msdn.microsoft.com/en-us/library/ee207183) –
La regola generale è che i generici non sono covarianti perché non si può sapere cosa si farà con esso. Non posso assegnare un 'Elenco' a un 'Elenco ' perché altrimenti, sarei in grado di aggiungere un 'Cane' alla' Lista 'nonostante sia davvero un' Elenco ' –
Powerlord