В C# значимые типы по умолчанию не могут иметь значение null. Если Вы объявите переменную как
int x;
то при чтении она будет равна 0. Если попытаться сделать так x=null, то получите эксепшн.
Чтобы иметь возможность присвоить переменной x null, есть тип
Nullable
Т.е. теперь, если сделать
Nullable<int> x;
то мы спокойно сможем сделать x=null;
Тип
int?
является синтаксическим сахаром, укороченным вариантом записи
Nullable<int>
, эти две записи по сути одно и то же.