If you want a primitive type that also expresses the concept of null, why not use the SqlDateTime type?
-----Original Message----- From: Joe Duffy [mailto:[EMAIL PROTECTED]] Sent: Friday, June 07, 2002 12:48 PM To: [EMAIL PROTECTED] Subject: [ADVANCED-DOTNET] Value type references (versus object references) Perhaps I am asking this question out of ignorance, but why are value type references handled differently than object references? I understand that value type instantiations are held on the stack versus the heap, but I must be missing something about the way in which references to these objects are held (does each reference actually store a copy of the value since they are passed by value? if so, how does example #2 below work?). I suppose, if I were not lazy, that I could examine the bytecode generated, but I figured that somebody on this list could provide a good explanation. For instance, I am mostly annoyed by the handling of references to NULL, which apparently value type references are incapable of. Let me illustrate an example. Say I am instantiating an entity object that represents some logical coupling of information stored in a relational database (common task, right?). Now, assume that I have a date column in one of the tables in the database that I am interested in representing within my object, which happens to hold a NULL value for the entity that I am loading (again, fairly common). It seems that my options for representing a NULL DateTime are as follows: 1) DataReader reader = // ... DateTime myDateColumn = // ... // ... if (reader["my_date_column"] is DBNull) { myDateColumn = DateTime.MinValue; // or some other "special value" indicating NULL } else { myDateColumn = (DateTime)reader["my_date_column"]; } One of the problems with this approach, is that wherever myDateColumn is referenced, the code needs to know that DateTime.MinValue signifies a NULL or empty value. Isn't this what NULL is for?!? 2) DataReader reader = // ... object myDateColumn = // ... // ... if (reader["my_date_column"] is DBNull) { myDateColumn = null; } else { myDateColumn = reader["my_date_column"]; } Obviously a better - and more true - representation of the value of this field; however, then I lose type safety, am forced to recast myDateColumn to DateTime whenever I access it, etc., etc. This gets messy after a while. Why is it that I cannot simply do: 3) DataReader reader = // ... DateTime myDateColumn = // ... // ... if (reader["my_date_column"] is DBNull) { myDateColumn = null; } else { myDateColumn = (DateTime)reader["my_date_column"]; } In addition, I find it odd that, should I go with #1 above, the following does not work: object xxx = (myDateColumn.Equals(DateTime.MinValue) ? null : myDateColumn); ...while the following does: object xxx = (myDateColumn.Equals(DateTime.MinValue) ? null : (object)myDateColumn); Thanks in advance. Best Regards, joe duffy You can read messages from the Advanced DOTNET archive, unsubscribe from Advanced DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com. You can read messages from the Advanced DOTNET archive, unsubscribe from Advanced DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com.