我们碰到了一个神奇的十进制数字,打破了我们的哈希表.我把它归结为以下最小的情况:
decimal d0 = 295.50000000000000000000000000m;
decimal d1 = 295.5m;
Console.WriteLine("{0} == {1} : {2}", d0, d1, (d0 == d1));
Console.WriteLine("0x{0:X8} == 0x{1:X8} : {2}", d0.GetHashCode(), d1.GetHashCode()
, (d0.GetHashCode() == d1.GetHashCode()));
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
295.50000000000000000000000000 == 295.5 : True
0xBF8D880F == 0x40727800 : False
Run Code Online (Sandbox Code Playgroud)
真正奇怪的是:更改,添加或删除d0中的任何数字,问题就会消失.甚至添加或删除其中一个尾随零!这个标志似乎并不重要.
我们的解决方法是将值除去以消除尾随零,如下所示:
decimal d0 = 295.50000000000000000000000000m / 1.000000000000000000000000000000000m;
Run Code Online (Sandbox Code Playgroud)
但我的问题是,C#怎么做错了?
我读了几个关于通过命令行构建mergemodules的Stackoverflow问题,但当有人建议使用devenv进行编译或使用Dark从现有的msi文件创建wix文件时,所有这些都被接受了.
考虑以下因素:
...如何在没有devenv的情况下从命令行构建合并模块,并且不会失去在visualstudio中为mergemodule解析自动化依赖关系的舒适度?也许有一个我没有找到它的nanttask?