In practice the terminology doesn't really matter much - I can't remember the last time I had to worry about it except when trying to write about it.
- An unbound type has no type arguments specified
- A constructed type has at least one type argument specified
- A type parameter is an open type
- An array type where the element type is open is an open type
- An open constructed type has at least one type argument which is an open type
- A closed type is any type which isn't open
(There are further rules for nested types. Consult the C# 3.0 spec section 4.4 for gory details.)
As an example of an open constructed type, consider:
public class NameDictionary<T> : Dictionary<string, T>
The base class of typeof(NameDictionary<>)
is:
- Constructed because it specifies type arguments
- Open because the second type argument (
T
) is an open type
The MSDN docs for Type.IsGenericType
have quite a useful little table.
Just to reiterate, this is almost entirely unimportant in day to day use.
I'm generally in favour of knowing the correct terminology - particularly for things like "pass by reference" etc - but in this case it really, really doesn't come up very often. I would like to actively discourage you from worrying about it :)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…