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.