2017-02-06 2 views
0

投げるとそれを検出するために、キャッチ、私は...実行時に、現在の未チェック/チェックされた算術コンテキストを検出することは可能ですか?

private static readonly int IntMaxValue = int.Parse(int.MaxValue.ToString()); 
private static bool IsChecked() 
{ 
    try { 
     var i = (IntMaxValue + 1); 
     return false; 
    } 
    catch (OverflowException) { 
     return true; 
    } 
} 

をチェックするために、このようなものを使用することができます...それは、タイトなループでオーバーヘッドがたくさんあります。これを行うには軽い方法がありますか?より多くのコンテキストの

EDIT ...

struct NarrowChar 
{ 
    private readonly Byte b; 
    public static implicit operator NarrowChar(Char c) => new NarrowChar(c); 
    public NarrowChar(Char c) 
    { 
     if (c > Byte.MaxValue) 
      if (IsCheckedContext()) 
       throw new OverflowException(); 
      else 
       b = 0; // since ideally I don't want to have a non-sensical value 
     b = (Byte)c; 
    } 
} 

答えがある場合は、単に「いいえ」、単に

+3

[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)が書かれています。 _あなたは何を解決しようとしていますか? ( 'int.MaxValue'ラウンドトリップを' string'値を送信する点に気にしないでください。なぜそのフィールドを持っていて、なぜそれを初期化するのですか?) –

+0

@PeterDunihoコンパイラはあなたに明らかにオーバーフローさせません。この例では、私はちょうどそれを取り巻いています。 –

+0

@PeterDunihoプリミティブ型と同じセマンティクスを使用したい型を実装しています(この場合変換型演算子はより大きな型からです) –

答えて

1

だから答えはノー」であると思わ:)と言うことを恐れてはいけません'しかし、私は私の特定の問題のための解決策を考え出した。この状況で終わる誰かに役立つかもしれません。

public NarrowChar(Char c) { 
    var b = (Byte)c; 
    this.b = (c & 255) != c ? (Byte)'?' : b; 
} 

まず、キャストを試みるだけでチェック/チェックされていないコンテキストを「プローブ」します。チェックされている場合、オーバーフロー例外は(Byte) cによってスローされます。チェックされていない場合、ビットマスクとcとの比較により、キャストにオーバーフローがあるかどうかがわかります。具体的なケースでは、Byteに収まらないChar?に設定されるように、NarrowCharというセマンティクスが必要です。 StringをISO-8759-1またはASCIIにコード変換する場合と同様に、?となります。

最初にキャストを行うことは、セマンティクスにとって重要です。インライン化bは、その "プロービング"動作を中断します。

関連する問題