Quando definiamo le nostre interfacce in C# 4.0, è possibile contrassegnare ciascuno dei parametri generici come in
o out
. Se proviamo a impostare un parametro generico come out e questo porterebbe a un problema, il compilatore genera un errore, non permettendoci di farlo.Inferenza covarianza e controvarianza in C# 4.0
Domanda:
Se il compilatore ha un modo di dedurre quali sono usi validi sia per covariance
(out
) e contravariance
(in
), perché dobbiamo segnare interfacce in quanto tali? Non sarebbe sufficiente limitarci a definire le interfacce come sempre, e quando abbiamo provato a usarle nel nostro codice cliente, abbiamo generato un errore se avessimo cercato di usarle in modo non sicuro?
Esempio:
interface MyInterface<out T> {
T abracadabra();
}
//works OK
interface MyInterface2<in T> {
T abracadabra();
}
//compiler raises an error.
//This makes me think that the compiler is cappable
//of understanding what situations might generate
//run-time problems and then prohibits them.
Inoltre,
non è vero ciò che Java fa nella stessa situazione? Da quello che ricordo, hai fatto qualcosa come
IMyInterface<? extends whatever> myInterface; //covariance
IMyInterface<? super whatever> myInterface2; //contravariance
O sto mescolando le cose?
Grazie
Penso che la sua seconda domanda fosse più simile a "In che modo le annotazioni sulla varianza di C# sono diverse dai caratteri jolly di Java?" – Gabe
@Gabe: C# presenta * varianza * dichiarazione-sito *. Java ha * varianza * call-site *. Chiamare la varianza del sito è un'idea interessante per essere sicuro, ma mi sembra strano avere un tipo di variante basato su come viene utilizzato in un particolare sito, al contrario di come è definito comportarsi. –
Sì, ora capisco qual è il problema con l'utilizzo di Java. Ha il vantaggio di non dover dichiarare i parametri dell'interfaccia come dentro o fuori, ma in questo caso alcuni client potrebbero dargli qualche utilità in questo momento che in seguito potrebbe non essere protetto se ho intenzione di aggiornare la mia interfaccia. –