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