Компилятор C # не имеет ни малейшего представления, что BigInteger логически является «целочисленным типом».Он просто видит пользовательский тип с заданным пользователем явным преобразованием в long.С точки зрения компилятора,
long long2 = (long)bigInt;
в точности совпадает с:
long long2 = someObject.SomeMethodWithAFunnyNameThatReturnsALong();
Он не может достичь внутри этого метода и сказать ему прекратить генерировать исключения.
Но когда компилятор видит
int x = (int) someLong;
, компилятор генерирует код, выполняющий преобразование, поэтому он может выбрать создание проверенного или непроверенного кода по своему усмотрению.
Помните, что «проверено» и «не проверено» не имеют никакого эффекта во время выполнения;Это не значит, что CLR переходит в «непроверенный режим», когда управление входит в непроверенный контекст.«check» и «unchecked» - это инструкции для компилятора о том, какой код генерировать внутри блока.Они действуют только во время компиляции, и компиляция преобразования BigInt в long уже произошла.Его поведение исправлено.