对值类型C#调用了ToString方法


One hh = new();
Console.WriteLine(hh.ToString());
Int32 ww = 77;
Console.WriteLine(ww.ToString());
Console.WriteLine(5.ToString());

我有一个One类,它不覆盖ToString方法,所以它的实例:hh在我调用It时返回One,这很好。我只是想弄清楚为什么ww.ToString()5.ToString()不像Int32那样返回,而是返回77和5?
据我所知,这里正在进行Boxing
我的意思是ww和5显然不是对象,但Int32隐式地派生了Object类。你能帮帮我吗?我真的很困惑。

您的问题让我陷入了从类层次结构外部调用父虚拟方法的陷阱。通过生成自己的IL,可以在任何类型上调用Object.ToString()

有了这些扩展方法和类包装器,你就可以做到这一点

using System.Reflection;
using System.Reflection.Emit;
public static class Object_Ext {
public static IEnumerable<T> AsSingleton<T>(this T item) => new[] { item };
public static IEnumerable<T> FollowedBy<T>(this T first, IEnumerable<T> rest) => first.AsSingleton().Concat(rest);
}
public static class DynamicMethodExt {
public static T CreateDelegateFor<T>(this DynamicMethod dm, T _) where T : Delegate => dm.CreateDelegate<T>();
}
static class Object_ToString_Ext {
private static Func<object, string> Object_ToString_Fn;
public static string Object_ToString<T>(this T obj) => Object_ToString_Fn(obj);
static Object_ToString_Ext() {
var m = typeof(Object).GetMethod("ToString");
var dm = new DynamicMethod("", m.ReturnType, m.DeclaringType.FollowedBy(m.GetParameters().Select(p => p.ParameterType)).ToArray(), m.DeclaringType);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, m);
il.Emit(OpCodes.Ret);
Object_ToString_Fn = dm.CreateDelegateFor(Object_ToString_Fn);
}
}

现在,如果您执行5.Object_ToString(),那么返回值将为System.Int32

最新更新