예제 #1
0
        public static bool Is <TOut>(this object?input, [NotNullWhen(true)] out TOut?output)
        {
            // if (input is TOut temp)
            // {
            //     output = temp;
            //     return true;
            // }
            // else
            // {
            //     output = default;
            //     return false;
            // }

            Emit.Ldarg(nameof(input));
            Emit.Isinst <TOut>();
            Emit.Brfalse("isnot");

            Emit.Ldarg(nameof(output));
            Emit.Ldarg(nameof(input));
            Emit.Unbox_Any <TOut>();
            Emit.Stobj <TOut>();
            Emit.Ldc_I4_1();
            Emit.Ret();

            MarkLabel("isnot");
            Emit.Ldarg(nameof(output));
            Emit.Initobj <TOut>();
            Emit.Ldc_I4_0();
            Emit.Ret();

            throw Unreachable();
        }
예제 #2
0
 public static bool IsDefault(this object?obj)
 {
     Emit.Ldarg(nameof(obj));
     Emit.Brfalse("yup");
     Emit.Ldc_I4_0();
     Emit.Ret();
     MarkLabel("yup");
     Emit.Ldc_I4_1();
     Emit.Ret();
     throw Unreachable();
 }