In .NET framework less than 4.0, the following Statement 2 will error out but will work in .NET 4.0+. Here, Furniture is abstract class and Table is concrete class.

Furniture table = new Table(); // Statement 1 works in all .NET versions
IEnumerable<Furniture> tables = new List<Table>(); // Statement 2 works only above .NET 4.0

What is this concept called as?

Covariance: An object that is instantiated with a more derived type argument is assigned to an object instantiated with a less derived type argument. Assignment compatibility is preserved. 

Contravariance is reverse of it.