为什么编译器选择了错误的方法重载?

raf*_*ags 5 c# polymorphism unity-game-engine

我有这个简单的方法:

public void CacheDelegate(Object obj, MemberInfo memberInfo)
{
   switch (memberInfo.MemberType)
   {
    case MemberTypes.Field:
       var fieldInfo = (FieldInfo) memberInfo;
       CacheDelegate(obj, fieldInfo);
       break;
    case MemberTypes.Property:
       var propertyInfo = (PropertyInfo) memberInfo;
       CacheDelegate(obj, propertyInfo);
       break;
    case MemberTypes.Method:
       var methodInfo = (MethodInfo) memberInfo;
       CacheDelegate(obj, methodInfo);
       break;
    default:
       throw new Exception("Cannot create a delegate for MemberInfo provided.");
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的方法解析了 memberInfo 的类型,并从下面调用了适用的方法:

public void CacheDelegate(Object obj, FieldInfo fieldInfo)
{
   // Do stuff...
}

public void CacheDelegate(Object obj, PropertyInfo propertyInfo)
{
   // Do stuff...
}

public sealed override void CacheDelegate(Object obj, MethodInfo methodInfo)
{
   // Do stuff...
}
Run Code Online (Sandbox Code Playgroud)

问题是最后一个 case 标签 case MemberTypes.Method 没有调用带有 Method Info 重载的 CacheDelegate 方法,而是调用带有 Member Info 重载的 CacheDelegate !所以它基本上只是递归地一遍又一遍地调用自己。我尝试在调用方法时指定参数名称 methodInfo: methodInfo,但是 Unity 引擎告诉我最好的重载方法不包含名为 methodInfo 的参数。

我很不明白为什么会这样。任何帮助将不胜感激。

Jon*_*nna 4

重载解析的工作原理如下。

从调用的类型开始,找到在该类型上声明的可以使用的方法集。

如果该集合为空,则尝试对声明的基类型或接口进行相同的操作。继续沿层次结构向上移动,直到找到至少一个匹配的方法,否则会出错。

在找到的集合中,使用最具体的方法。如果平局则出错。

因此,在这四个方法中,有三个是在此类中声明的。这三者中有两个不适用。这样就只剩下public void CacheDelegate(Object obj, MemberInfo memberInfo)明确要调用的正确类了,所以它被调用了。

您可以使用((BaseType)this).CacheDelegate(obj, methodInfo);强制进行所需的调用,因为基本类型只有一种CacheDelegate重载可供选择。