Chapter 4. Revising Generics

In This Chapter

  • Understanding variance

  • Working with contravariance

  • Using covariance

Generics are covered in length in Books I and II, as they relate to creating collections of objects or business concepts, and how they impact object-oriented programming. They also play a large role in dynamic design and programming, which Chapter 1 of this book covers.

The generics model implemented in C# 2.0 was incomplete. Although parameters in C# all allow for variance in several directions, generics do not.

Variance has to do with types of parameters and return values. Covariance means that an instance of a subclass can be used when an instance of a parent class is expected, while Contravariance means that an instance of a superclass can be used when an instance of a subclass is expected. When neither is possible, it is called Invariance.

All fourth-generation languages support some kind of variance. In C# 3.0 and earlier versions, parameters are covariant and return types are contravarient. So, this works because string and integer parameters are covariant to object parameters:

public static void MessageToYou(object theMessage)
   if (theMessage != null)
MessageToYou("It's a message, yay!");

And this works because object return types are contravarient to string and integer return types (for example):

object theMessage = MethodThatGetsTheMessage();

Generics are nonvariant in C# 2.0 and 3.0. This means that if Basket<apple> ...

Get C# 2010 All-in-One For Dummies® now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.