я мог бы использовать что-то вроде этого, чтобы проверить ...Возможно ли во время выполнения определить текущий неконтролируемый/проверенный арифметический контекст?
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;
}
}
Если ответ просто «нет», не бойтесь просто сказать, что :)
У этого есть [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), написанная на нем. Что вы пытаетесь решить? (Не важно, в чем смысл отправлять «int.MaxValue» в оба конца через значение «string»? Почему это поле вообще и зачем его инициализировать таким образом?) –
@PeterDuniho компилятор не позволит вам явно переполнять , Я просто обойдусь в этом примере. –
@PeterDuniho Я реализую тип, который хотел бы иметь ту же семантику, что и примитивные типы (в данном случае это операторы преобразования из более крупного типа) –