In C#, when does Type.FullName return null? : <p>The <a href="https://msdn.microsoft.com/en-us/library/system.type.fullname(v=vs.110).aspx">MSDN for Type.FullName</a> says that this property return</p>

<blockquote>
  <p><strong>null</strong> if the current instance represents a generic type parameter, an array type, pointer type, or <strong>byref</strong>type based on a type parameter, or a generic type that is not a generic type definition but contains unresolved type parameters.</p>
</blockquote>

<p>I count five cases, and I find each one more unclear than the last.  Here is my attempt to construct examples of each case.</p>

<pre><code>using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication {
  public static class Program {

    public static void Main(string[] args) {
      GenericTypeParameter();
      ArrayType();
      PointerType();
      ByRefTypeBasedOnTypeParameter();
      NongenericTypeDefinitionWithUnresolvedTypeParameters();
      Console.ReadKey();
    }

    public static void GenericTypeParameter() {
      var type = typeof(IEnumerable&lt;&gt;)
        .GetGenericArguments()
        .First();
      PrintFullName("Generic type parameter", type);
    }

    public static void ArrayType() {
      var type = typeof(object[]);
      PrintFullName("Array type", type);
    }

    public static void PointerType() {
      var type = typeof(int*);
      PrintFullName("Pointer type", type);
    }

    public static void ByRefTypeBasedOnTypeParameter() {
      var type = null;
      PrintFullName("ByRef type based on type parameter", type);
    }

    private static void NongenericTypeDefinitionWithUnresolvedTypeParameters() {
      var type = null;
      PrintFullName("Nongeneric type definition with unresolved type parameters", type);
    }

    public static void PrintFullName(string name, Type type) {
      Console.WriteLine(name + ":");
      Console.WriteLine("--Name: " + type.Name);
      Console.WriteLine("--FullName: " + (type.FullName ?? "null"));
      Console.WriteLine();
    }
  }
}
</code></pre>

<p>Which has this output.</p>

<pre><code>Generic type parameter:
--Name: T
--FullName: null

Array type:
--Name: Object[]
--FullName: System.Object[]

Pointer type:
--Name: Int32*
--FullName: System.Int32*

ByRef type based on type parameter:
--Name: Program
--FullName: ConsoleApplication.Program

Nongeneric type definition with unresolved type parameters:
--Name: Program
--FullName: ConsoleApplication.Program
</code></pre>

<p>I am only one for five with two "blanks".</p>

<h2>Question</h2>

<blockquote>
  <p>Can someone modify my code to give simple examples of each way in which Type.FullName can be null?</p>
</blockquote>
