C# 泛型和从差异类调用重载方法-优先级问题
首先,为标题感到抱歉,但我想不出更好的了 我的问题可以通过简单的代码示例来说明:C# 泛型和从差异类调用重载方法-优先级问题,c#,generics,overloading,C#,Generics,Overloading,首先,为标题感到抱歉,但我想不出更好的了 我的问题可以通过简单的代码示例来说明: 公共静态类测试 { 公共静态int GetInt(T源) { 返回Convert.ToInt32(源); } } 公共静态类转换 { 公共静态int到nt32(字节源) { 返回30; } 公共静态int到int32(对象源) { 返回10; } } 为什么Console.WriteLine(Test.GetInt(20))打印10,而不是30? 我一直认为.NET中的泛型是在运行时由JIT解决的。那么为什么ji
公共静态类测试
{
公共静态int GetInt(T源)
{
返回Convert.ToInt32(源);
}
}
公共静态类转换
{
公共静态int到nt32(字节源)
{
返回30;
}
公共静态int到int32(对象源)
{
返回10;
}
}
为什么Console.WriteLine(Test.GetInt(20))代码>打印10
,而不是30
?
我一直认为.NET中的泛型是在运行时由JIT解决的。那么为什么jitter不够聪明,无法找到适合我们这里的byte
参数类型的ToInt32(byte)
方法呢
此行为使
Convert
静态类方法调用导致简单类型的装箱/取消装箱操作。编译器必须在编译时决定选择哪个方法。它不会发出任何代码来决定在运行时选择两个重载中的哪一个。由于您没有向C#编译器提供任何证据证明GetInt(t source)
仅适用于byte
结构,因此编译器必须选择其他重载
或者让我换一个角度来看:如果删除ToInt32(object)
重载,程序将无法编译
编译器在编译时决定执行哪个方法
我通过反射器查看IL代码,发现了这个-
.method public hidebysig static int32 GetInt(!T source) cil managed
{
.maxstack 1
.locals init (
[0] int32 CS$1$0000)
L_0000: nop
L_0001: ldarg.0
L_0002: box !T
L_0007: call int32 ConsoleApplication1.Convert::ToInt32(object) <-- HERE
L_000c: stloc.0
L_000d: br.s L_000f
L_000f: ldloc.0
L_0010: ret
}
有没有办法让它调用
byte
方法(或者通常是可用的最佳方法)?如果只有true,请检查typeof(T)==typeof(byte)+转换为byteway@MarcinJuraszek:装箱真的是个问题吗?@Steven是的,因为它会带来不必要的性能损失。Test.GetInt(byte.Parse(“20”))
返回10,我发现它很奇怪,监视窗口显示类型为object{byte},这可能会提供一些关于发生了什么的线索
public static class Test<T>
{
public static int GetInt(T source)
{
dynamic dynamicSource = source;
return Convert.ToInt32(dynamicSource );
}
}