2017-02-06 11 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 подскажут, произошло ли переполнение в кастинге. В нашем конкретном случае нам нужна семантика NarrowChar, так что Char, которая не будет вписываться в Byte, будет установлена ​​в ?; как если бы вы перекодировали String из в ISO-8759-1 или ASCII, вы получаете ?.

Выполнение броска сначала важно для семантики. Inlining b нарушит это поведение «зондирования».