当其中一个函数具有带约束的泛型参数时,不能声明具有相同名称的2个函数

时间:2014-03-19 17:01:40

标签: c# generics

没什么大不了的,但我有点好奇为什么这不是编译。我有这个片段,其中两个方法具有相同的签名,但参数类型除外。在第一种情况下,参数类型是对象,在第二种情况下,参数类型是通用的,但必须实现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);
    }
}

2 个答案:

答案 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,使其最适合此次通话。