在下面的:
public class p
{
short? mID;
short? dID;
}
short id = p.mID ?? -p.dID.Value;
编译器给我错误:
我必须将代码更改为以下代码才能起作用:
short id = p.mID ?? (short)-p.dID.Value;
好像编译器正在做类似(int)0-p.dID.Value或Int16.operator-正在返回Int32s一样的事情...?
最佳答案
我请您引用规范的7.6.2节,其中指出:
对于形式为–x的操作,将应用一元运算符重载解析来选择特定的运算符实现。操作数将转换为所选运算符的参数类型,结果的类型为运算符的返回类型。预定义的求反运算符为:
整数取反:
int operator –(int x);
long operator –(long x);
通过从零减去x来计算结果。如果x的值是操作数类型的最小可表示值(对于int为-2 ^ 31,对于long则为-2 ^ 63),则在操作数类型中x的数学取反无法表示。如果这在检查的上下文中发生,则抛出System.OverflowException;否则,将抛出System.OverflowException。如果它发生在未经检查的上下文中,则结果是操作数的值,并且不会报告溢出。
如果求反运算符的操作数的类型为uint,则将其转换为long类型,结果的类型为long。异常(exception)的规则是允许将int值−2147483648(−2 ^ 31)写为十进制整数文字。
如果否定运算符的操作数为ulong类型,则会发生编译时错误。异常(exception)情况是允许将长值−9223372036854775808(−2 ^ 63)写为十进制整数文字的规则。
浮点数取反:
float operator –(float x);
double operator –(double x);
结果是x的值,其符号取反。如果x为NaN,则结果也为NaN。
小数取反:
decimal operator –(decimal x);
通过从零减去x来计算结果。十进制取反等效于使用类型System.Decimal的一元减号运算符。
如您所见,在短裤上没有定义一元减号运算符;重载解析选择int上的一个,因为该整数是所有可用一元减运算符中的最佳匹配。
关于c# - 一元减一元变成整数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2058182/