Wednesday, 15 September 2010

Covariance with C# Generics -



Covariance with C# Generics -

given interface iquestion , implementation of interface amquestion, suppose next example:

list<amquestion> typed = new list<amquestion>(); ilist<iquestion> nontyped = typed;

this illustration yields, expected, compile error saying 2 not of same type. states explicit conversion exists. alter this:

list<amquestion> typed = new list<amquestion>(); ilist<iquestion> nontyped = typed ilist<iquestion>;

which compiles but, @ run time, nontyped null. if explain 2 things:

why doesn't work. how can accomplish desired effect.

it appreciated. give thanks you!

the fact amquestion implements iquestion interface not translate list<amquestion> deriving list<iquestion>.

because cast illegal, as operator returns null.

you must cast each item individually such:

ilist<iquestion> nontyped = typed.cast<iquestion>().tolist();

regarding comment, consider next code, usual cliché animal examples:

//lizard , donkey inherit animal list<lizard> lizards = new list<lizard> { new lizard() }; list<donkey> donkeys = new list<donkey> { new donkey() }; list<animal> animals = lizards list<animal>; //let's pretend doesn't homecoming null animals.add(new donkey()); //reality unravels!

if allowed cast list<lizard> list<animal>, theoretically add together new donkey list, break inheritance.

c# generics covariance

No comments:

Post a Comment