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(); }
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(); }