首先,对这个标题感到抱歉,但我想不出更好的了......
我的问题可以通过简单的代码示例来呈现:
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;
}
}
为什么Console.WriteLine(Test<byte>.GetInt(20));
prints 10
, 代替30
?
我一直认为.NET 中的泛型是在运行时由 JIT 解析的。那么为什么抖动不够智能,无法发现存在ToInt32(byte)
方法,适合我们的byte
这里的参数类型?
这种行为使得Convert
静态类方法调用会导致简单类型的装箱/拆箱操作。
编译器必须在编译时决定选择哪种方法。它不会发出任何代码来在运行时决定选择两个重载中的哪一个。因为您没有向 C# 编译器提供任何证据表明GetInt(T source)
仅适用于byte
结构,编译器必须选择其他重载。
或者让我换个角度来看:如果你删除ToInt32(object)
过载,你的程序无法编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)