I am rather confused by your question, since the preamble of the question shows that you know what the answer is. You cannot convert List<string> to List<object> , because then you can add Giraffe to the list of objects, which is actually a list of strings, which is not typical.
If you replace "TypeA" with "List", TypeB<int> with "object" and "TypeC" with "string", then you have turned your situation into one that you already know does not work for good reasons. This does not mean that the compiler magically knows something about List and simply does not allow the List script - rather, the compiler does not allow such dispersion.
In C # 4, we add deviations regarding any interface and delegate types that are known to be typical in variance. This is the "choose" model - you need to prove that you are safe, and only then we will allow you to use the variance.
source share