You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#委托无法接受兼容的返回类型?

为什么返回short的方法不能赋值给返回int的委托?

先看你给出的代码示例:

delegate int test14();
class vb {
    static public short test() {
        return 45;
    }
}

//Main method
test14 hbd = vb.test; // 编译报错,无法直接赋值

这个限制的具体原因可以从这几点理解:

  • 值类型不支持委托协变
    C#的委托协变规则只对引用类型生效,比如返回string的方法可以赋值给返回object的委托,因为string是object的派生类。但short和int都是值类型,它们之间不存在继承关系,只是数值范围上的兼容,所以不符合委托协变的要求,编译器不会允许这种赋值。

  • 委托签名的严格匹配要求
    委托本质是对方法签名的严格绑定,底层调用存根需要完全匹配方法的参数和返回类型。当你调用hbd()时,CLR会期望得到一个int类型的返回值,但vb.test()返回的是short。虽然short可以隐式转成int,但这个转换需要额外的指令支持,而委托的设计逻辑是直接调用目标方法,不会自动插入隐式转换的代码,否则会破坏调用的确定性和性能。

  • 规则简洁性的考虑
    如果允许值类型的隐式转换适配委托返回值,那反过来(返回int的方法赋值给返回short的委托)肯定会有溢出风险,无法通过编译。这种单向允许的规则会让委托的类型匹配逻辑变得复杂,开发者容易混淆场景。C#团队选择严格匹配值类型的返回类型,让规则更清晰,减少潜在的逻辑错误。

内容的提问来源于stack exchange,提问作者Erik_JI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:07:13