2017-02-06 1 views
0

ich so etwas wie dies verwenden könnte ...Ist es möglich, zur Laufzeit den aktuellen ungeprüften/geprüften arithmetischen Kontext zu erkennen?

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; 
    } 
} 

zu überprüfen ... aber das ist eine Menge Aufwand in einer engen Schleife, Werfen und Fangen nur um es zu erkennen. Gibt es einen leichteren Weg, dies zu tun?

EDIT für mehr Kontext ...

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; 
    } 
} 

Wenn die Antwort nur ‚Nein‘ ist, keine Angst, einfach zu sagen, dass :)

+3

Dies hat [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) über alles geschrieben. Was versuchst du wirklich zu lösen? (Egal was ist der Punkt des Sendens von 'int.MaxValue' round-trip durch einen' string' Wert? Warum dieses Feld überhaupt, und warum es so initialisieren?) –

+0

@PeterDuniho der Compiler wird Sie offensichtlich nicht überlaufen lassen . Ich komme nur in dem Beispiel herum. –

+0

@PeterDuniho Ich implementiere einen Typ, der die gleiche Semantik wie die primitiven Typen haben soll (in diesem Fall sind es Umwandlungsoperatoren von einem größeren Typ) –

Antwort

1

So ist die Antwort zu sein scheint ‚Nein ', aber ich fand die Lösung für mein spezielles Problem. Es könnte für jemanden anderen nützlich sein, der in dieser Situation endet.

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

Zuerst "untersuchen" wir den aktivierten/deaktivierten Kontext, indem wir einfach den Cast ausprobieren. Wenn wir überprüft werden, wird die Überlauf-Ausnahme von (Byte) c ausgelöst. Wenn wir nicht markiert sind, sagt uns die Bitmaske und der Vergleich zu c, ob es einen Überlauf im Casting gab. In unserem speziellen Fall wollen wir die Semantik von NarrowChar so, dass eine Char, die nicht in eine Byte gesetzt wird, auf ? gesetzt wird; Genau wie wenn Sie eine String von zu ISO-8759-1 oder ASCII transcodieren, erhalten Sie ?.

Die erste Besetzung ist wichtig für die Semantik. Inlining b wird dieses "sondierende" Verhalten brechen.

Verwandte Themen