2014-05-02 20 views
5

questa dichiarazione di classe:non possono ereditare con i generici

public abstract class Repository<TE, TD> 
    where TE : class, IEntity, new() 
    where TD : DataProvider<TE> 

non possono essere soddisfatte da questa firma classe:

public class SqlRepository<TE> : Repository<TE, SqlDataProvider> 
    where TE : SqlEntity, new() 

Dove SqlEntity : IEntity e SqlDataProvider : DataProvider<SqlEntity>, ottengo questo errore:

Error 1 The type ~ cannot be used as type parameter 'TD' in the generic type or method '~.Repository'. There is no implicit reference conversion from '~.SqlDataProvider' to '~.DataProvider'.

Perché non può convertire SqlEntity nell'interfaccia che implementa?

risposta

4

Il problema è quello che in SqlRepository<TE> si fissa parametro generico interno TD s', che è legata al TE in Repository<TE, TD> Dichiarazione, da SqlEntity, ma questo non può essere detto su TE, che viene lasciato generico.

Cosa si può fare, è continuare a TD generico SqlDataProvider come questo:

public class SqlDataProvider<TD> : DataProvider<TD> 
    where TD : SqlEntity 

e poi emergere questa dipendenza in SqlRepository come questo:

public class SqlRepository<TE> : Repository<TE, SqlDataProvider<TE>> 
    where TE : SqlEntity, new() 

Questo compila, perché TE utilizzo è coerente .

+0

Vale anche la pena leggere: http://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx – Haney

+0

Grazie, questo ha risolto il problema. Tuttavia, il motivo per cui non volevo utilizzare un generico per la classe SqlDataProvider era perché volevo utilizzare il modello singleton. Questo causa un avvertimento quando si usa il generic in quanto non ama i campi statici in una classe generica e preferirei che ci fosse solo una istanza di provider di dati colpita dalla compilazione piuttosto che dall'implementazione. è possibile, o dovrò semplicemente lasciare un commento fortemente formulato? – jokulmorder

+0

Non capisco come si possa usare questo per far rispettare un singleton. Potresti aggiornare la tua domanda con il codice pertinente e la descrizione dell'intenzione? –

Problemi correlati