<p>What is the meaning of the concepts 'covariance' and 'contravariance'?</p>

<p>Given 2 classes, <strong>Animal</strong> and <strong>Elephant</strong> (which inherits from <strong>Animal</strong>), my understanding is that you would get a run-time errors if you try and put an Elephant into an array of Animals, and this happens because Elephant is "bigger" (more specific) than Animal.  But could you place an Animal into an array of Elephant, seeing how Elephant is guaranteed to contain the Animal properties?</p>

Have a look at this overview of covariance and contravariance in C# 4.0 and see if that helps:
http://blogs.msdn.com/charlie/archive/2008/10/27/linq-farm-covariance-and-contravariance-in-visual-studio-2010.aspx