▁with ▁any ▁viol ation ▁being ▁fatal , ▁that ▁such ▁use ▁is ▁glob ally ▁consistent . ▁The ▁above ▁interfaces ▁are ▁declared ▁as ▁, ▁, ▁and ▁. ▁Types ▁with ▁more ▁than ▁one ▁type ▁parameter ▁may ▁specify ▁different ▁var ian ces ▁on ▁each ▁type ▁parameter . ▁For ▁example , ▁the ▁delegate ▁type ▁ ▁represents ▁a ▁function ▁with ▁a ▁cont rav ari ant ▁input ▁parameter ▁of ▁type ▁ ▁and ▁a ▁cov ari ant ▁return ▁value ▁of ▁type ▁. ▁ ▁The ▁typing ▁rules ▁for ▁interface ▁variance ▁ensure ▁type ▁safety . ▁For ▁example , ▁an ▁ ▁represents ▁a ▁first - class ▁function ▁expecting ▁an ▁argument ▁of ▁type ▁, ▁and ▁a ▁function ▁that ▁can ▁handle ▁any ▁type ▁of ▁animal ▁can ▁always ▁be ▁used ▁instead ▁of ▁one ▁that ▁can ▁only ▁handle ▁c ats . ▁ ▁Array s ▁ ▁Read - only ▁data ▁types ▁( s ources ) ▁can ▁be ▁cov ari ant ; ▁write - only ▁data ▁types ▁( s inks ) ▁can ▁be ▁cont rav ari ant . ▁M utable ▁data ▁types ▁which ▁act ▁as ▁both ▁sources ▁and ▁s inks ▁should ▁be ▁invariant . ▁To ▁illustrate ▁this ▁general ▁phenomen on , ▁consider ▁the ▁array ▁type . ▁ ▁For ▁the ▁type ▁ ▁we ▁can ▁make ▁the ▁type ▁, ▁which ▁is ▁an ▁" array ▁of ▁animals ". ▁ ▁For ▁the ▁purposes ▁of ▁this ▁example , ▁this ▁array ▁supports ▁both ▁reading ▁and ▁writing ▁elements . ▁ ▁We ▁have ▁the ▁option ▁to ▁treat ▁this ▁as ▁either : ▁ ▁cov ari ant : ▁a ▁ ▁is ▁an ▁; ▁ ▁cont rav ari ant : ▁an