Un null SQL n'est pas identique à un null .NET; vous devez comparer avec System.DBNull.Value :
object sqlDateTime = sqldatareader[0];
DateTime? dt = (sqlDateTime == System.DBNull.Value)
? (DateTime?)null
: Convert.ToDateTime(sqlDateTime);
En réponse à votre commentaire, le type de données de l'Item propriété d'un DataReader est celui du type de base de données sous-jacent. Cela pourrait être System.Data.SqlTypes.SqlDateTime pour une base de données SQL Server non nulle, ou System.DBNull pour une colonne nulle, ou System.Data.Odbc.OdbcTypes.SmallDateTime pour une base de données ODBC, ou vraiment à peu près n'importe quoi. La seule chose sur laquelle vous pouvez compter est qu'il est de type object .
C'est aussi pourquoi je suggère d'utiliser Convert.ToDateTime() au lieu de taper la coercition sur DateTime . Il n'y a aucune garantie qu'une colonne ODBC ou toute autre colonne de date puisse être convertie en un DateTime .NET . Je note que votre commentaire spécifie un "sqldatareader" et un SQL Server System.Data.SqlTypes.SqlDateTime peut en effet être contraint à un System.DateTime , mais votre question initiale ne nous le disait pas.
Pour plus d'informations sur l'utilisation de DataReader s, consultez MSDN.