using System.Reflection.Emit;
public static void Main()
PrintFloat((float)number);
PrintFloat((float)notNumber);
PrintFloat(ToFloat1(number));
PrintFloat(ToFloat2((ushort)number));
PrintFloat(ToFloat3(notNumber));
PrintFloat(ToFloat4(ref number));
private static void PrintFloat(float value)
Console.WriteLine(value.ToString());
private static Func<int, float> ToFloat1 = MakeCast<int, float>();
private static Func<ushort, float> ToFloat2 = MakeCast<ushort, float>();
private static Func<int?, float> ToFloat3 = MakeCast<int?, float>();
private static RefFunc<int, float> ToFloat4 = MakeRefCast<int, float>();
private static Func<T, V> MakeCast<T, V>()
var dm = new DynamicMethod("Cast", typeof(V), new[] { typeof(T) }, typeof(Program).Module);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
return (Func<T, V>)dm.CreateDelegate(typeof(Func<T, V>));
private static RefFunc<T, V> MakeRefCast<T, V>()
var dm = new DynamicMethod("RefCast", typeof(V), new[] { typeof(T).MakeByRefType() }, typeof(Program).Module);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
return (RefFunc<T, V>)dm.CreateDelegate(typeof(RefFunc<T, V>));
private delegate TResult RefFunc<T, TResult>(ref T argument);