▁must ▁be ▁valid ▁cov ari antly ▁and ▁all ▁the ▁method ▁parameter ▁types ▁must ▁be ▁valid ▁cont rav ari antly , ▁where ▁valid ▁S - ly ▁is ▁defined ▁as ▁follows : ▁ ▁Non - generic ▁types ▁( classes , ▁struct s , ▁en ums , ▁etc .) ▁are ▁valid ▁both ▁co - ▁and ▁cont rav ari antly . ▁ ▁A ▁type ▁parameter ▁ ▁is ▁valid ▁cov ari antly ▁if ▁it ▁was ▁not ▁marked ▁, ▁and ▁valid ▁cont rav ari antly ▁if ▁it ▁was ▁not ▁marked ▁▁ ▁An ▁array ▁type ▁ ▁is ▁valid ▁S - ly ▁if ▁ ▁is . ▁( This ▁is ▁because ▁C # ▁has ▁cov ari ant ▁arrays .) ▁ ▁A ▁generic ▁type ▁ ▁is ▁valid ▁S - ly ▁if ▁for ▁each ▁parameter ▁, ▁▁ ▁A i ▁is ▁valid ▁S - ly , ▁and ▁the ▁it h ▁parameter ▁to ▁ ▁is ▁declared ▁cov ari ant , ▁or ▁ ▁A i ▁is ▁valid ▁( not ▁S )- ly , ▁and ▁the ▁it h ▁parameter ▁to ▁ ▁is ▁declared ▁cont rav ari ant , ▁or ▁ ▁A i ▁is ▁valid ▁both ▁cov ari antly ▁and ▁cont rav ari antly , ▁and ▁the ▁it h ▁parameter ▁to ▁ ▁is ▁declared ▁invariant . ▁ ▁As ▁an ▁example ▁of ▁how ▁these ▁rules ▁apply , ▁consider ▁the ▁ ▁interface . ▁ ▁interface ▁I List < T > ▁{ ▁▁▁▁ ▁void ▁Insert ( int ▁index , ▁T ▁item ); ▁▁▁▁ ▁IE numer ator < T > ▁Get E numer ator (); ▁} ▁The ▁parameter ▁type ▁ ▁of ▁ ▁must