为什么编译器选择错误的方法重载?
我有这个简单的方法:
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."); } }
上面的方法解析了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... }
问题是最后一个case标签,例如MemberTypes.Method,没有使用Method Info重载调用CacheDelegate方法,而是调用带有Member Info重载的CacheDelegate! 所以它基本上只是一遍又一遍地反复呼唤自己。 我在调用方法时尝试指定参数名称methodInfo:methodInfo,但Unity引擎告诉我最好的重载方法不包含名为methodInfo的参数。
我完全不知道为什么会发生这种情况。 任何帮助将不胜感激。
过载分辨率的工作原理如下。
从名为on的类型开始,找到在该类型上声明的可以使用的方法集。
如果该集合为空,则尝试使用所声明的基本类型或接口。 继续向上移动层次结构,直到找到至少一个匹配的方法,否则出错。
在找到的集合中,使用最具体的方法。 错误,如果它是一个平局。
因此,在这四种方法中,有三种是在这个类中声明的。 其中三个不适用。 只留下public void CacheDelegate(Object obj, MemberInfo memberInfo)
作为要调用的正确类,因此调用它。
你可以使用((BaseType)this).CacheDelegate(obj, methodInfo);
强制执行所需的调用,因为基类型只有一个CacheDelegate
重载可供选择。
Jon Hanna已经解释了为什么会发生这种情况,我将通过提供您可以阅读详细信息的源规范来添加: https : //msdn.microsoft.com/en-us/library/aa691336(v = vs.71 )的.aspx
您可以通过以下几种方式解决问题:
上述就是C#学习教程:为什么编译器选择错误的方法重载?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/960127.html