没什么大不了的,但我有点好奇为什么这不是编译。我有这个片段,其中两个方法具有相同的签名,但参数类型除外。在第一种情况下,参数类型是对象,在第二种情况下,参数类型是通用的,但必须实现interfaceA。编译器说它不能将int转换为interfaceA,但它显然不会尝试使用具有匹配签名的函数。这记录在哪里?这取决于框架吗? (使用4.0)。提前谢谢!
public interface interfaceA
{
}
public class classA : interfaceA
{
}
public class classB
{
public void doSmthg(object argument)
{
}
public void doSmthg<T>(T argument) where T : interfaceA
{
}
static void Main(string[] args)
{
int myInt = 1;
doSmthg(myInt);
}
}
答案 0 :(得分:3)
重载决策不考虑通用约束 - 请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx。
这意味着选择了doSmthg
的通用版本,但由于int
不是interfaceA
,因此约束失败。
答案 1 :(得分:0)
这是因为重载决策是由给定方法主体的编译器执行的。到这种情况发生时,<T>
已替换为int
,使其最适合此次通话。