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

编辑:我最初的问题有点吸引我不想要的答案。标题实际上总结了这个问题,而用于说明它的示例选择不当。

在上面,编译器只有一种可能:int.divide 运算符不支持可为空的 int 操作数,int? 确实如此,这就解决了。没有歧义,也不需要任何类型的在场规则。

但是,如果我有两种重载同一个运算符的类型,比如说除法,并且它们都支持另一种类型作为操作数之一,该怎么办?

这里真的有两个问题:

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

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

最后,这些问题可能有点学术性,因为在许多实际场景中,任何类型的方法(无论是虚拟方法、普通实例方法还是静态“实用”方法,即使后者最接近于运算符)都可以用于同样的结局。再说一次,在某些情况下,通过使用运算符而不是普通方法语法来启用更易于阅读的语法可能会获得真正的价值。(语法是语言首先具有运算符的唯一原因;它毕竟只是一种方法。)

4

1 回答 1

2

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

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

 var x = normal/nullable.Value;

但是,当您结合正常和可空值时,请考虑可空值是“未知的”。多少钱x + unknown?又是未知数。并且因为结果可能是null表达式的结果类型,所以必须可以为空。

于 2012-10-25T09:27:58.543 回答