在下面的:
public class p
{
short? mID;
short? dID;
}
short id = p.mID ?? -p.dID.Value;
编译器给我错误:
错误 21 无法将类型“int”隐式转换为“short”。存在显式转换(您是否缺少强制转换?)
我必须将代码更改为以下内容才能使其正常工作:
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;如果它发生在未经检查的上下文中,则结果是操作数的值并且不会报告溢出。
如果求反运算符的操作数为uint类型,则将其转换为long类型,并且结果类型为long。一个例外是允许将 int 值 −2147483648 (−2^31) 写为十进制整数文字的规则。
如果求反运算符的操作数是 ulong 类型,则会发生编译时错误。一个例外是允许将长值 −9223372036854775808 (−2^63) 写为十进制整数文字的规则。
浮点求反:
float operator –(float x);
double operator –(double x);
结果是 x 的值,其符号反转。如果 x 为 NaN,则结果也为 NaN。
小数求反:
decimal operator –(decimal x);
结果是通过从零减去 x 来计算的。十进制求反相当于使用 System.Decimal 类型的一元减运算符。
正如您所看到的,shorts 上没有定义一元减运算符;重载解析选择整数上的一个,因为它是所有可用一元减运算符的最佳匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)