为何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
相关产品推荐
相关产品推荐

