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静态类方法在简单类型的装箱/拆箱操作中调用结果.
编译器必须在编译时决定选择哪种方法.它不会发出任何代码来在运行时决定选择哪两个重载.因为您没有向GetInt(T source)只适用于byte结构的C#编译器提供任何证据,所以编译器必须选择另一个重载.
或者让我以不同的角度来看待它:如果你删除了ToInt32(object)重载,你的程序就无法编译.