In addition to the valuable advice given to you by Sergey, I'd like to add some comments on 'DateTime.
1. DateTime is a Struct: it behaves like a Value Type: no "reference" to it is possible. So, it can never be null.
2. An un-initialized DateTime has the default value of DateTime.MinValue: "1/1/0001 12:00:00 AM," and its TimeOfDay Property the default value: "00:00:00"
3. Programmers do often use comparing DateTime.MinValue with a DateTime (non-nullable) to test for an invalid, or missing, date.
4. When you use a nullable DateTime, some interesting things happen: consider these declarations
DateTime? dt1;
DateTime dt2;
DateTime dt3 = new DateTime(0);
DateTime? dt4 = DateTime.MinValue;
DateTime? dt5 = new DateTime(2014, 1, 31, 6, 0, 0, DateTimeKind.Utc);
Consider:
bool isMinDate1 = dt1 == DateTime.MinValue;
bool isMinDate2 = dt2 == DateTime.MinValue;
bool isMinDate3 = dt3 == DateTime.MinValue;
bool isMinDate4 = dt4 == DateTime.MinValue;
bool isMinDate5 = dt5 == DateTime.MinValue;
If you try and access DateTime Fields, like TimeOfDay, in a nullable DateTime: you will get an error, even if the nullable DateTime contains a valid DateTime instance, not null !
You'll note that if you display the IntelliSense for a nullable DateTime you get only the basic Object properties, but you do get a 'Value Field. For a non-nullable DateTime, there is no 'Value Field.
However, there's a "gotcha" in using the 'Value Field:
if the nullable DateTime variable is un-initialized, like 'dt1 in the code above, your app will break with a System.InvalidOperationException error if you try and access it.
So, make your choice based on consideration of these differences in "regular" vs. nullable DateTime Types.
And, keep in mind that a DateTime? is really a Nullable<DateTime> ... see: [
^]. Nullable<T> generic Types were implemented in .NET 2.0.
You might want to review Value vs. Reference Types in .NET: [
^].