Si supponga che ho un'interfaccia comeCo/controvarianza con Func <in T1, fuori TResult> come parametro di
public interface IInterface<in TIn, out TOut> {
IInterface<TIn, TOut> DoSomething(TIn input);
}
TIn
essere contra -variant, e TOut
essendo co -variant.
ora, voglio chiamanti di essere in grado di specificare alcune funzione da eseguire sul valore dell'ingresso, così ingenuamente vorrei aggiungere il seguente metodo per l'interfaccia:
IInterface<TIn, TOut> DoSomethingWithFunc(Func<TIn, TOut> func);
che ... non funziona. TIn
ora è necessario essere covariante e TOut
controvariante.
Capisco, che non posso usare i tipi generici covarianti come input per i metodi, ma ho pensato che potrei usarli in un tipo generico nidificato che a sua volta specifica la varianza (Func<in T1, out TResult>
).
Ho provato a creare un nuovo tipo di delegato con tipi co-/controvarianti e modificare l'interfaccia per accettare un argomento di questo tipo, senza alcun risultato (stesso errore).
public delegate TOut F<in TDlgIn, out TDlgOut>(TDlgIn input);
public interface IInterface<in TIn, out TOut> {
IInterface<TIn, TOut> DoSomethingWithFunc(F<TIn, TOut> func);
}
C'è un modo per rendere felice il compilatore? È persino possibile (ad esempio con altri tipi annidati o argomenti generici aggiuntivi)? Se no, perché no?
Non sono sicuro se [questa discussione] (http://stackoverflow.com/a/8100545/11683) sia applicabile, ma potrebbe essere. – GSerg
Penso, questo è relativo a una domanda che ho chiesto qualche tempo fa: http: // stackoverflow.it/questions/6126741/covarianza-contravariance-conundrum-when-using-generic-interface-constraints – MattC
Hai provato a 'delegare TOut F (input TDlgIn) '? Quando si passa in delegati, la contropartita deve essere il contrario. –