我认为这看起来像是 C# 编译器中的一个错误。
考虑这段代码(在方法内):
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
它编译时没有错误(或警告)。似乎是一个错误。0
运行时,在控制台上打印。
然后没有const
,代码:
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
当它运行时,它会正确地导致OverflowException
被抛出。
C# 语言规范特别提到了这种情况,并说 aSystem.OverflowException
应该被抛出。它不依赖于上下文checked
或unchecked
看起来(编译时常量操作数对余数运算符的错误与checked
and相同unchecked
)。
int
( )会发生同样的错误System.Int32
,而不仅仅是long
( System.Int64
)。
相比之下,编译器dividend / divisor
对const
操作数的处理比dividend % divisor
.
我的问题:
我是对的,这是一个错误吗?如果是,这是他们不希望修复的众所周知的错误(因为向后兼容性,即使% -1
与编译时常量一起使用是相当愚蠢的-1
)?或者我们应该报告它,以便他们可以在即将发布的 C# 编译器版本中修复它?