c# - short 上的一元减号变成了 int?

标签 c# int short

在以下内容中:

public class p
{
  short? mID;
  short? dID;
}

short id = p.mID ?? -p.dID.Value;

编译器给我错误:

Error 21 Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)

我必须将代码更改为以下内容才能正常工作:

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。一个异常(exception)是允许将 int 值 −2147483648 (−2^31) 写为十进制整数文字的规则。

如果否定运算符的操作数是 ulong 类型,则会发生编译时错误。一个异常(exception)是允许将 long 值 −9223372036854775808 (−2^63) 写为十进制整数文字的规则。

浮点取反:

float operator –(float x);
double operator –(double x);

结果是 x 的符号反转后的值。如果 x 为 NaN,则结果也为 NaN。

十进制取反:

decimal operator –(decimal x);

结果是通过从零减去 x 计算得出的。小数取反等同于使用 System.Decimal 类型的一元减号运算符。


如您所见,短裤上没有定义一元减号运算符;重载决策选择 int 上的一个,因为那个是所有可用的一元减号运算符的最佳匹配。

关于c# - short 上的一元减号变成了 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2058182/

相关文章:

c# - 扩展 Visual Studio 2012 HTML IntelliSense

java - s = s + s 和 s += s 之间的区别

c# - 如何获取下个月每一天的名称?

c# - 如何解码使用 encodeURIComponent() 在 JS 中编码的 HTML?

C++如何检查函数是否正在接收无符号整数?

java - 如何通过负 int 值检查退出 Double ArrayList 的 While 循环?

python - 对文件进行分区以进行并行下载

c - 指针类型转换: effect on buffer length?

c++ - 为什么我的文件会出现损坏的输出?

c# - ASP.NET MVC Entity Framework 延迟加载或 ViewModel?