Each instance of a type type is a new type. i MetaData<int> is a different type than MetaData<bool> . The compiler generates this type (check the use of the .Net reflector)
Namespace.Metadata`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Thus, you cannot declare a list of heterogeneous types. You can only declare a list of one type. Therefore, it is necessary that all generic MetaData <> classes inherit from an abstract class or interface.
source share