Durante la lettura di un section di un articolo su covarianza e controvarianza su Wikipedia, mi sono imbattuto nel seguente, la frase in grassetto:covarianza e controvarianza con C# Array
in primo luogo considerare il costruttore tipo array: dal tipo
Animal
siamo può fare il tipoAnimal[]
("array di animali"). Dovremmo trattare questo come
- covariante: un
Cat[]
è unAnimal[]
- controvariante: un
Animal[]
è unCat[]
- o nessuno dei due (invariante)?
Se si desidera evitare errori di tipo e la matrice supporta sia elementi di lettura che di scrittura, solo la terza scelta è sicura. Chiaramente, non tutti gli
Animal[]
possono essere trattati come se fosseroCat[]
, poiché un client che legge dall'array si aspetta un Cat, ma unAnimal[]
può contenere ad es. aDog
. Quindi la regola controvariante non è sicura.Al contrario, uno
Cat[]
non può essere considerato comeAnimal[]
. Dovrebbe essere sempre possibile inserireDog
inAnimal[]
. Con gli array covarianti non si può garantire che questo sia sicuro, dal momento che il backing store potrebbe effettivamente essere una schiera di gatti. Quindi anche la regola covariante non è sicura: il costruttore di array dovrebbe essere invariato. Si noti che questo è solo un problema per gli array mutabili; la regola covariante è sicura per gli array immutabili (di sola lettura).
Capisco il concetto; Voglio solo un esempio di come "non può essere garantito che sia sicuro" in C#.
http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance.aspx – SLaks
Non so perché questo è chiuso come duplicato della domanda collegata. Una q più correlata: [why-is-array-co-variance-considered-so-orrible] (http://stackoverflow.com/questions/4317459/why-is-array-co-variance-considered-so-horrible) – nawfal