11

私は自分のコードで使用するために、別の質問から以下のコードを借用しました(わずかに変更されています):

internal class PositiveDouble 
{
      private double _value;
      public PositiveDouble(double val) 
      {
          if (val < 0)
              throw new ArgumentOutOfRangeException("Value needs to be positive");
          _value = val;
      }

      // This conversion is safe, we can make it implicit
      public static implicit operator double(PositiveDouble d)
      {
          return d._value;
      }
      // This conversion is not always safe, so we're supposed to make it explicit
      public static explicit operator PositiveDouble(double d)
      {
          return new PositiveDouble(d); // this constructor might throw exception
      }
}

このコードの元の作成者は、MSDN の暗黙的および明示的なドキュメントに記載されている警告に正しく準拠していますが、ここに私の質問があります:潜在的に例外的なコードでexplicit常に必要ですか?

したがって、PositiveDouble から派生したコード ("Volume" など) にいくつかの型があり、以下の最初の行のようにインスタンスを便利に設定できるようにしたいと考えています。

Volume v = 10; //only allowed by implicit conversion
Volume v = new Volume(10)  //required by explicit conversion, but gets messy quick

どこでも明示的なキャストを使用することを余儀なくされると、コードの可読性が大幅に低下します。ユーザーをどのように保護しますか? 私のプログラムのセマンティクスでは、Volume が負になることは決してありません。実際、それが発生した場合、例外がスローされることを期待しています。したがって、暗黙的な変換を使用してそれがスローされた場合、どのような「予期しない結果」が私を壊す可能性がありますか?

4

2 に答える 2