C#委托协变对int不生效?解析案例3的编译错误原因
为什么案例3会出现编译错误?
问题核心在于C#对方法组转换为委托的规则限制,虽然所有类型最终都派生自object,但并非所有类型转换都能在方法组转换中自动触发:
- 案例1(
string→object):string是引用类型,从string到object属于隐式引用转换,完全符合委托方法组转换的规则,因此可以直接赋值。 - 案例2(
ValueType→object):Test2的返回类型是ValueType,当它返回1(int类型)时,在方法内部已经完成了装箱操作(int是值类型,赋值给ValueType需要装箱为引用类型实例),所以Test2的返回值本身就是引用类型,从ValueType到object同样是隐式引用转换,符合规则。 - 案例3(
int→object):Test3的返回类型是int(值类型),委托要求返回object,这里需要对返回值执行装箱转换,但C#的方法组转换规则不会自动为返回值插入装箱操作——方法组转换要求方法的返回类型和委托返回类型之间必须是隐式引用转换、隐式数值转换,或是值类型到对应可空值类型的转换,装箱转换不在允许范围内,因此编译报错。
如果要让案例3通过编译,你可以用lambda表达式手动触发装箱:
DelegateType case3 = () => Test3();
此时编译器会自动生成装箱代码,将Test3返回的int转换为object。
内容的提问来源于stack exchange,提问作者ps1Xt
相关产品推荐
相关产品推荐

