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) Console.Writeline(theMessage) } //then: MessageToYou("It's a message, yay!"); MessageToYou(4+6.6);
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 the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.