2013-03-15 2 views
7

更新:私は答えを見つけました。+演算子をオーバーロードして、チェックされたコンテキストまたはチェックされていないコンテキストで呼び出されるようにします。


私は数値構造体を作成していますので、算術演算子をオーバーロードしています。ここで、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つのオーバーロードを宣言する方法があります。一方はチェックされ、他方はチェックされません。また、実行時に、発信者の状況を判断する方法がある(非常に低いようだが、私はそれにもかかわらず尋ねると思った)、このような何か:、checkeduncheckedキーワードを

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."); 
} 
+0

これは多かれ少なかれ不可能であると答えるhttp://stackoverflow.com/questions/2873765/how-to-find-out-the-current-overflow-checking-contextです。待っていますあなたのアプローチ... –

+0

@AlexeiLevenkov私が見つけた答えは不可能であることも示しています。私が考えてきたアプローチの1つは、明示的に変換された 'UInt4Checked'と' UInt4Unchecked'型を定義することです。 – phoog

+0

Downvoter、説明してください。 – phoog

答えて

2

According to MSDNintegral typesにのみ適用されます。したがって、チェックされたキーワードとチェックされていないキーワードを使用できる独自のタイプを作成することはできません。

+1

閉じるので+1しますが、何もないのでこの答えを受け入れるつもりはありません最初のページに "*組み込み*整数型"を指定します。私は自分自身の積分型を定義しようとしています。なぜなら、チェックされた/チェックされていないコンテキストに敏感でありたいからです。言い換えれば、組み込みの整数型のドキュメントへの最初のページに明示的なリンクがあるはずですが、そうでないため、ページがあいまいになります。私は明確な情報源を見つけ、それを引用する最初の答えを受け入れる。 – phoog

+0

私はそれを得たと思う。暗黙の変換演算子をオーバーライドせず、[このSOスレッド](http://stackoverflow.com/questions/7615113/define-custom-integer)のような組み込みの整数型の1つに変換できるようにしたからですベースのタイプ)が示唆している。MSDNのどこにでも明示的に記述されているのはわかりませんが、[this thread]の一番下にあるEric Lippertの説明どおりにswitch文がどのように動作するかは似ています(http://stackoverflow.com/questions/5154104/what-exactly-are-integral-types)である。 –

+0

ああ、そうじゃない。正解は「自分のタイプを作成することはできません...」です。考えてみましょう:暗黙の変換演算子を組み込みの整数型に作成した場合、定義しようとしている型の範囲ではなく、組み込みの整数型の範囲に対してオーバーフローチェックが行われます。リンクしているSOスレッドの例は、チェックされていないコンテキストでオーバーフローするとロールオーバーしません。 – phoog

関連する問題