В .net 2.0 появился новый тип, допускающий значение NULL, который можно использовать для присвоения значений NULL базовым типам значений, таким как
int? k = 3;//Тип значения, допускающий значение NULL (называемый нулевым типом)
int m = null;//ошибка
int? j = null;//Success Из приведенного выше примера мы видим, что тип значения, допускающий значение NULL, может быть определен после типа значения. В C# после базового типа добавляется знак ?, а в VB.NET In, вы можете сделать это
Dim dtmVarName As Nullable (Of DateTime)
Dim intVarName As Nullable (Of Integer)
Dim bVarName As Nullable (Of Boolean)
Следует отметить, что нулевой тип не является новым типом данных .NET.
Фактически нулевой тип — это универсальный класс System.Nullable<T>, определенный в библиотеке .NET, где T — заменяемый тип значения.
int? k = 3; также можно записать как System.Nullable<int> k = 3;
Операции реализуются посредством перегрузки операторов этого класса.
Вы можете использовать hasvalue, чтобы определить, присвоено ли пустому типу значение
if (dtmVarName.HasValue)
{
//...сделать что-нибудь
}.
http://www.cnblogs.com/jackyrong/archive/2006/08/26/486796.html