Conversion Operators
One of my
many jobs here at MS is helping out with the .NET Framework Design Guidelines
Document. Tonight I had to make a small tweak to a guideline I added last
week so I thought while I was in there I would post it here to see if folks had
comments.
-----------------------------------------------------------------------------
7.10
Conversion Operators
- Do
not
define cast operators in publicly exposed APIs. The exception to this rule is for
creating “primitive” types such as Int32, Double, or DateTime. - Do not
define
casting operators outside of a types domain – for example Int32, Double, and
Decimal are all numeric types – while DateTime is not. Therefore there should be no cast
operator to go from a Double to a DateTime. A constructor is preferred in this
case. - Do
not use
cast operators in a surprising way.
That is only provide them where there is a strong expectation that they
would be there and ideally some prior art that justifies
them. - Do
not lose
precision in implicit casts. - For
example, there should not be an implicit cast from Double to Int32, but there may be one from
Int32 to Int64. - Do not
throw exceptions from implicit casts because it is very difficult for the
developer to understand what is happening. - Do
provide casts that operate on the whole object. The value that is cast
represents the whole value being cast, not one sub part. For example, it is
not appropriate for a Button to cast to a string by returning its
caption. - Do
not
generate a semantically different value. - For
example, it is appropriate to convert a Time or TimeSpan into an Int. The Int
still represents the time or duration. It does not make sense to convert a
file name string such as, "c:\mybitmap.gif" into a Bitmap object. - Do
cast
values that are in the same domain. Do not cast values from different
domains. Casts operate within a
particular domain of values. For example, numbers and strings are different
domains. So it makes sense that an Int32 can cast to a Double. It does not
make sense for an Int to cast to a String, because they are in different
domains.