Amo i generici in C#, ma a volte lavorare con loro può diventare un po 'complicato. Il problema qui sotto mi imbatte di tanto in tanto. C'è un modo per semplificare questo scenario? Non riesco a vedere come, ma spero che qualcuno possa :)È possibile semplificare i generici annidati in C#?
Dati tre classi di base:
public abstract class Inner
{
}
public abstract class Outer<T>
where T : Inner
{
}
public abstract class Handler<TOuter, TInner>
where TOuter : Outer<TInner>
where TInner : Inner
{
public abstract void SetValue(TInner value);
}
E alcune semplici implementazioni:
public class In : Inner
{
}
public class Out : Outer<In>
{
}
public class HandleOut : Handler<Out, In>
{
public override void SetValue(In value) { }
}
Ora la mia domanda è: per HandleOut
, il tipo di TInner
è dato dal tipo "Out", quindi esiste un modo per semplificare la definizione di HandleOut
in qualcosa come public class HandleOut : Handler<Out>
e ancora essere in grado di utilizzare il tipo interno come parametro per SetValue
?
Questo è un esempio molto semplice, ma a volte ottengo una lunga lista di tipi generici nelle definizioni, quando di solito tutti possono essere dedotti dal primo tipo logicamente. Ci sono trucchi che mi mancano?
Ho corretto il codice in modo che venga compilato. Puoi controllare per vedere se è corretto dal POV della tua domanda? – Enigmativity
Anche se non è allineato al 100% con quello che penso tu stia chiedendo, potresti voler leggere un post sul blog di Eric Lippert intitolato [Perché i vincoli generici non sono ereditati] (http://ericlippert.com/2013/07/15/ why-are-generic-constraints-not-inherited /) (e, infatti, il fatto che non siano ereditati è il motivo per cui Enigmativity ha dovuto correggere il codice per aggiungere * più * vincoli) –
Grazie, @Enigmativity. Ho appena scritto il codice al volo - le tue modifiche sono esattamente secondo i miei pensieri :) –