繁体   English   中英

使用运算符重载时,C#编译器如何确定哪种实现适用于混合类型操作数?

[英]With operator overloading, how does the C# compiler decide which implementation applies with mixed-type operands?

int normal;
int? nullable;
var x = normal/nullable; // expression evaluates to Nullable<int>
var y = nullable/normal; // also Nullable<int>

编辑:我原来的问题是有点邀请我不想要的答案。 标题实际上是对问题的总结,而用来说明问题的示例选择得很差。

在上面,编译器只有一种可能性:int.divide运算符不支持可为null的int操作数,int? 做到了,那就解决了。 没有歧义,也不需要任何形式的存在规则。

但是,如果我有两个重载同一个运算符的类型,例如为示例而除,又都支持另一种类型作为操作数之一怎么办?

这里确实有两个问题:

1)当两种类型都支持Type1 / Type2和Type2 / Type1时,编译器如何决定使用Type1还是Type2中的运算符? 是否有从左到右的优先级(对于二进制操作)或其他?

2)是否有关于对称等运算的假设? 换句话说,A + B是否必须始终等于B + A,还是取决于类型?

最后,这些问题可能只是学术上的问题,因为在许多实际情况中,可以使用任何形式的方法(无论是虚拟方法,普通实例方法还是静态“实用”方法,即使后者与操作员最相似)也可以使用。相同的目的。 再有,在某些情况下,通过启用使用运算符而不是常规方法语法而产生的更易于阅读的语法,可以获得真正的价值。 (语法是语言首先具有运算符的唯一原因;毕竟这只是一种方法。)

编译器如何确定适用的是可空类型的除法运算符,而不是常规的int运算符?

因为无法应用“常规”运算符。
当然,这使用常规运算符:

 var x = normal/nullable.Value;

但是,当您将normal和nullable结合使用时,请考虑nullable是'unknnown'。 x + unknown多少? 再次未知。 并且由于结果可能为null ,因此表达式的结果类型必须为可空。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM