To quote the C# 5.0 specification §18.2 Pointer Types
Unlike references (values of reference types), pointers are not
tracked by the garbage collector—the garbage collector has no
knowledge of pointers and the data to which they point. For this
reason a pointer is not permitted to point to a reference or to a
struct that contains references, and the referent type of a pointer
must be an unmanaged-type.
An unmanaged-type is any type that isn’t a
reference-type or constructed type, and doesn’t contain reference-type
or constructed type fields at any level of nesting. In other words, an
unmanaged-type is one of the following:
- sbyte, byte, short, ushort,
int, uint, long, ulong, char, float, double, decimal, or bool.
- Any
enum-type.
- Any pointer-type.
- Any user-defined struct-type that is
not a constructed type and contains fields of unmanaged-types only.
The key section that is stopping you is a the constructed type restriction.
from §1.6.3 Type parameters (emphasis mine)
A generic type with type arguments provided, like Pair<int,string> above, is called a constructed type.
Any generic type where you specify the type parameters is considered a constructed type and constructed types are not allowed to be in pointers. That is why Nullable<int> is not allowed.