Those are the type arguments. These are used to enforce type safety without sacrificing re usability. It's a little too big of a topic for a SO question but I recommend reading this; http://msdn.microsoft.com/en-us/library/512aeb7t.aspx or Jon Skeets C# In Depth which does a good job of explaining them.
As an example lets just talk about Dictionary<TKey, TValue>
where TKey
is the type of the key and TValue
is the type of the value. You declare those arguments when you instantiate the collection. There are also ways to put some constraints on which types are allowed but I'll leave that to you to read about. Basically, if I declare;
Dictionary<string, MyObjectType> dic = new Dictionary<string, MyObjectType>();
Then try someting like;
dic.Add(1, InstanceOfMyObjectType);
I will get a compiler error because my collection will only take a string for the key and an instance of MyObjectType for the value.