Csharp/C#教程:为什么编译器选择错误的方法重载?分享


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

我有这个简单的方法:

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

(0)
上一篇 2021年11月24日
下一篇 2021年11月24日

精彩推荐