protected override ICode VisitUnboxAny(ExprUnboxAny e) {
     if (!e.Type.IsValueType) {
         // On ref-type, unbox-any becomes a castclass
         var expr = (Expr)this.Visit(e.Expr);
         var cast = new ExprCast(e.Ctx, expr, e.Type);
         return cast;
     }
     var ctx = e.Ctx;
     if (e.Type.IsNullable()) {
         // If obj==null create Nullable with hasValue=false
         // If obj.Type not assignable to e.InnerType throw InvalidCastEx
         var innerType = e.Type.GetNullableInnerType();
         var unboxMethod = ((Func<object, int?>)InternalFunctions.UnboxAnyNullable<int>).Method.GetGenericMethodDefinition();
         var mUnbox = ctx.Module.Import(unboxMethod).MakeGeneric(innerType);
         var unboxAnyCall = new ExprCall(ctx, mUnbox, null, e.Expr);
         return unboxAnyCall;
     } else {
         // If obj==null throw NullRefEx
         // If obj.Type not assignable to e.Type throw InvalidCastEx
         // otherwise unbox
         var unboxMethod = ((Func<object, int>)InternalFunctions.UnboxAnyNonNullable<int>).Method.GetGenericMethodDefinition();
         var mUnbox = ctx.Module.Import(unboxMethod).MakeGeneric(e.Type);
         var unboxAnyCall = new ExprCall(ctx, mUnbox, null, e.Expr);
         return unboxAnyCall;
     }
 }
 protected override ICode VisitUnboxAny(ExprUnboxAny e) {
     this.code.Append("unbox(");
     this.Visit(e.Expr);
     this.code.Append(")");
     return e;
 }
 protected override ICode VisitUnboxAny(ExprUnboxAny e) {
     throw new InvalidOperationException("This should never occur");
 }
 private Stmt UnboxAny(TypeReference type) {
     var value = this.stack.Pop();
     var expr = new ExprUnboxAny(this.ctx, value, type);
     return this.SsaLocalAssignment(expr);
 }