更新:私は答えを見つけました。+演算子をオーバーロードして、チェックされたコンテキストまたはチェックされていないコンテキストで呼び出されるようにします。
私は数値構造体を作成していますので、算術演算子をオーバーロードしています。ここで、4ビットの符号なし整数を表す構造体の例である:ここで、
var x = new UInt4(10);
var y = new UInt4(11);
var z = x + y;
計算オーバーフローので、変数zがあります
public struct UInt4
{
private readonly byte _value;
private const byte MinValue = 0;
private const byte MaxValue = 15;
public UInt4(int value)
{
if (value < MinValue || value > MaxValue)
throw new ArgumentOutOfRangeException("value");
_value = (byte) value;
}
public static UInt4 operator +(UInt4 a, UInt4 b)
{
return new UInt4((a._value + b._value) & MaxValue);
}
}
過負荷加算演算子は、このコードを可能にします値5
。私はまた、これを行うことができます:
var x = new UInt4(10);
var y = new UInt4(11);
var z = checked (x + y);
このサンプルは、OverflowExceptionをスローする必要があります。それをどうすれば実現できますか?
私はすでに確認されコンテキストが呼び出されるメソッドに拡張しないことを確立したので、例えば、これは関係なく、それがオンまたはオフコンテキストで呼び出されているかどうかの、スローされません。
public static UInt4 operator +(UInt4 a, UInt4 b)
{
int i = int.MaxValue;
//this should throw in a checked context, but when
//the operator is used in a checked context, this statement
//is nonetheless unchecked.
byte b = (byte)i;
return new UInt4((a._value + b._value) & MaxValue);
}
です加算演算子の2つのオーバーロードを宣言する方法があります。一方はチェックされ、他方はチェックされません。また、実行時に、発信者の状況を判断する方法がある(非常に低いようだが、私はそれにもかかわらず尋ねると思った)、このような何か:、checked
とunchecked
キーワードを
public static UInt4 operator +(UInt4 a, UInt4 b)
{
byte result = (byte)(a._value + b._value);
if (result > MaxValue)
if (ContextIsChecked())
throw new OverflowException();
else
result &= MaxValue;
return new UInt4(result);
}
private static bool ContextIsChecked()
{
throw new NotImplementedException("Please help.");
}
これは多かれ少なかれ不可能であると答えるhttp://stackoverflow.com/questions/2873765/how-to-find-out-the-current-overflow-checking-contextです。待っていますあなたのアプローチ... –
@AlexeiLevenkov私が見つけた答えは不可能であることも示しています。私が考えてきたアプローチの1つは、明示的に変換された 'UInt4Checked'と' UInt4Unchecked'型を定義することです。 – phoog
Downvoter、説明してください。 – phoog