title: Are open generic types considered concrete? How can we qualify abstraction by parameterization?
body: <p>You can't create an instance of an type that contains generic parameters.</p>
  
  <p>However, it isn't abstract or an interface.  </p>
  
  <p>I was reading the StructureMap <code>TypeExtensions</code> helpers and I came across: </p>
  
  <pre><code>public static bool IsConcrete(this Type type)
  {
      return (!type.IsAbstract &amp;&amp; !type.IsInterface);
  }
  </code></pre>
  
  <p>I'm not really happy with the way that's interpreted, because to it seems like if a type is concrete, then it should be possible for there to be an instance of it.  For example, I have trouble considering something like <code>typeof(List&lt;&gt;).MakeGenericType(typeof(List&lt;&gt;).MakeGenericType(typeof(List&lt;&gt;)))</code> to be a concrete type.  </p>
  
  <p>I understand that an open generic type in C# and an abstract type in C# are very different in the way that they how they deviate from concretion, but at the same time, there is something fundamentally abstract about both of them.  Abstract classes and interface could be interpreted as parameterized if you consider that their parameters are operation implementations.  However, this is going a little off topic.  </p>
  
  <p>What I really want to know is a way to unify these concepts with consistent semantics that don't feel like a lie where an abomination like <code>List&lt;List&lt;List&lt;&gt;&gt;&gt;</code> can be concrete.  Do we have a universal way to describe this distinction?</p>