C#带返回值多播委托调用未执行全部绑定方法问题咨询
C# 多播委托返回值与调试报错问题解答
一、带返回值的多播委托仅返回单个方法结果的原因
- C# 多播委托本质是委托实例组成的链表,调用时会按绑定顺序依次执行所有绑定的方法
- 当委托返回值为非
void类型时,整个委托调用的最终返回值仅为链表最后一个方法的返回值,前面所有方法的返回值会被直接丢弃 - 你第一版代码中两个方法实际上都完成了执行,并非GendalfGreeting未生效,只是它的返回值因为绑定顺序的问题被丢弃,没有被
ToConsole方法捕获输出 - 当你把委托返回值改为
void后,不需要处理返回值,两个方法内部的控制台输出逻辑都会正常执行,因此可以看到两个输出结果 - 如果需要获取所有绑定方法的返回值,可以调用委托实例的
GetInvocationList()方法遍历每个委托单独执行、收集返回值,示例代码如下:
foreach (Greeting del in greetingInstance.GetInvocationList()) { string result = del.Invoke(); Console.WriteLine(result); }
二、调试时报method = internal error evaluating expression的原因
- 该报错属于调试器的已知内部错误,常见于旧版本的Visual Studio或者.NET Framework运行时环境,和你的代码逻辑无关
- 触发原因是调试器的表达式计算引擎在解析多播委托的绑定方法列表时出现了计算失败,不会影响代码的实际运行效果
- 常见修复方案:
- 升级Visual Studio到最新稳定版
- 调试时通过
GetInvocationList()方法手动查看委托的绑定方法列表,避免直接查看委托实例的原生内部属性
内容的提问来源于stack exchange,提问作者Chusya
相关产品推荐
相关产品推荐

