泛型和从差异类调用重载方法 - 优先级问题

Mar*_*zek 9 c# generics overloading

首先,抱歉标题,但我想不出更好的事情......

我的问题可以通过简单的代码示例呈现:

public static class Test<T>
{
    public static int GetInt(T source)
    {
        return Convert.ToInt32(source);
    }
}

public static class Convert
{
    public static int ToInt32(byte source)
    {
        return 30;
    }

    public static int ToInt32(object source)
    {
        return 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么Console.WriteLine(Test<byte>.GetInt(20));打印10,而不是30

我一直认为.NET中的泛型在运行时由JIT解决.为什么然后抖动不够智能,找出ToInt32(byte)适合我们byte参数类型的方法?

此行为使Convert静态类方法在简单类型的装箱/拆箱操作中调用结果.

Ste*_*ven 7

编译器必须在编译时决定选择哪种方法.它不会发出任何代码来在运行时决定选择哪两个重载.因为您没有向GetInt(T source)只适用于byte结构的C#编译器提供任何证据,所以编译器必须选择另一个重载.

或者让我以不同的角度来看待它:如果你删除了ToInt32(object)重载,你的程序就无法编译.