猿问

你在C#或.NET中看到的最奇怪的情况是什么?

你在C#或.NET中看到的最奇怪的情况是什么?

我收集了几个角落的箱子大脑挑逗者总是想听更多。该页面只涉及C#语言位和bobs,但我也发现核心.NET内容也很有趣。例如,这里有一个不在页面上,但我觉得难以置信的:

string x = new string(new char[0]);string y = new string(new char[0]);Console.WriteLine(object.ReferenceEquals(x, y));

我希望打印错误-毕竟,“新”(引用类型)创建一个新的对象,不是吗?C#和CLI的规范都表明它应该。在这个特殊的情况下。它打印了True,并在我测试过的框架的每个版本上都这样做了。(无可否认,我还没有在Mono上试过.)

我要说的是,这只是我想要的那种东西的一个例子-我并不是特别想要讨论和解释这个奇怪的东西。(这与正常的字符串实习不一样;特别是,在调用构造函数时,通常不会发生字符串实习。)我真的是在要求类似的奇怪行为。

还有其他宝石藏在外面吗?


白衣染霜花
浏览 332回答 3
3回答

aluckdog

银行家的四舍五入。这个不是编译器的错误或故障,但肯定是一个奇怪的角落的情况..NET Framework使用了一种称为Banker舍入的方案或舍入。在银行家的四舍五入中,0.5个数字被四舍五入到最近的偶数,所以Math.Round(-0.5) == 0Math.Round(0.5) == 0Math.Round(1.5) == 2Math.Round(2.5) == 2etc...这可能导致一些意想不到的错误,在财务计算的基础上,更著名的回合半四舍五入。VisualBasic也是如此。

慕姐8265434

如果调用为Rec(0)(不是在调试器下)?static&nbsp;void&nbsp;Rec(int&nbsp;i){ &nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(i); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;<&nbsp;int.MaxValue) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rec(i&nbsp;+&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;}}答:在32位JIT上,它应该会导致StackOverflow异常。在64位JIT上,它应该将所有数字打印到int.MaxValue这是因为64位JIT编译器应用尾调用优化。,而32位的JIT没有。不幸的是,我没有一台64位的机器来验证这一点,但是这个方法确实满足了尾叫优化的所有条件。如果有人有,我想看看是否是真的。
随时随地看视频慕课网APP
我要回答