[MemoryDiagnoser] public class BM { enum E { a, b, c } E val; [GlobalSetup] public void Setup() { val = new Random().NextDouble() > .5 ? E.b : E.c; } [Benchmark] public long Cast() => Propagate((long)val); [Benchmark] public long IConvertible() => CastViaIConvertible(val); [Benchmark] public long EnumUtilsCast() => EnumUtils.Cast(val); static long CastViaIConvertible(T val) where T : struct, IConvertible { return val.ToInt64(null); } static long Propagate(T val) where T : IConvertible { return val.ToInt64(null); } }