为什么这不会引起关于歧义方法的某种错误?

时间:2014-03-19 21:02:36

标签: c# reflection ambiguous-call

我正在搞乱看看我能做什么,不能做什么做泛型。我有这种情况,就我而言,编译器应该抛出一个关于模糊方法调用的错误,但它编译完全正常。那是为什么?

public interface IFunctionStrategy<T>
{
    T Strategy(params object[] parameters);
}

public class FunctionStrategyBase<T> : IFunctionStrategy<T>
{
    public virtual T Strategy(params object[] parameters)
    {
        MethodBase current = MethodBase.GetCurrentMethod();
        return (T)GetType().InvokeMember(current.Name, BindingFlags.InvokeMethod | BindingFlags.Public, Type.DefaultBinder, this, parameters);
    }

}

public class ConnectionConnect : FunctionStrategyBase<int>
{
    public int Strategy(int i)
    {
        return i;
    }
}

4 个答案:

答案 0 :(得分:4)

没有歧义。正如您在评论中所说,签名是不同的。在ConnectionConnect的上下文中,现在有一个

Strategy(int i)

Strategy(params object[] parameters)继承自FunctionStrategyBase

这是完全可以接受的重载。无论运行时发生了什么,如果你不知道这些函数的机制,可能会发生奇怪的行为,编译器看不到严格的问题。

在运行时调用时,程序将使用最接近匹配的签名,然后检查签名是否可以进行有效的隐式转换。如果将单个int传递给Strategy,则将使用Strategy(int i)方法。如果你没有这个,它会隐式地将你的int打包并将其作为该语言的一个特征传递给Strategy(params object[] parameters)

答案 1 :(得分:2)

它在C#Spec中定义了如何解析方法,因此没有歧义:

  

7.4.3.2 更好的函数成员给定一个参数列表A,其中包含一组参数表达式{E1,E2,...,EN}和两个适用的函数   具有参数类型{P1,P2,...,PN}和{Q1的成员MP和MQ,   Q2,...,QN},MP被定义为比MQ更好的函数成员

     

...

     

•否则,如果MP适用于其正常形式且MQ具有   params数组,仅适用于其扩展形式,然后是MP   优于MQ。

     

•否则,如果MP的声明参数少于MQ,则MP为   比MQ更好。如果两种方法都有params数组,则会发生这种情况   仅适用于其扩展形式。

答案 2 :(得分:1)

您的代码只显示一个方法调用,使用反射完成。

因此,分辨率无法在编译时完成,这就是为什么你的代码编译得很好。

此外,没有歧义,因为每个班级只有一种方法。

答案 3 :(得分:0)

如果我正确理解此评论

  

策略,两种策略在签名方面都有所不同,它将如何   能够在param object []参数和int i之间判断?

然后param object[]int i不需要分开,因为param object[]指定了任意类型的可变参数数量。因此,当声明int i时,i被装入object并作为单项数组传递给函数。但不确定我是否正确地解释了评论。