C# 中的奇怪行为:将字符串解析为双打错误

Strange Behavior In C#: Parsing Strings To Doubles Bug

更新:

这是一个 link 的项目,即使它在 VS 2015 CE .NET 4.6 中明确为双精度项目也会失败。 https://dl.dropboxusercontent.com/u/20941617/Scratchpad.zip

好的,我知道如何复制它。当它在显式运算符代码块上中断时,您只需直接从调试中复制字符串并将其粘贴到 'a' 中,即使它看起来像普通字符串也会中断。

double a = double.Parse("1");
double b = double.Parse("1");

原文:

为什么 'a' 有效但 'b' 抛出异常:"Input string was not in a correct format."?

double a = double.Parse("1");
var b = double.Parse("1");

同样的异常也出现在下面的场景中。

Number n = (Number)"‎1";

Number 是我制作的自定义数据类型(结构)。它无法将字符串解析为双精度值。

public static explicit operator Number(string n)
{
        double x = double.Parse(n);
        return new Number(x);
}

更奇怪的是,我将我的结构复制到我为复制错误而创建的新项目中。但是...在具有相同结构的原始项目中,它不会抛出异常。

我从文本文件加载常量并将它们转换为 Number 就好了。这些常量有效:

pi,3.14159265358979323846,none
π,3.14159265358979323846,none
golden ratio,1.61803398874989484820,none
phi,1.61803398874989484820,none
φ,1.61803398874989484820,none

但是当它到达这个常量时它抛出相同的异常。

Euler's constant,0.577215664901532860606512,none

它也会在“0.1”上抛出它,但不是所有时候......这真的很令人困惑,这就是为什么我制作了一个新项目,但由于某种原因它在新项目中的行为有所不同。

我在所有项目中都使用 .NET 4.6。我最初使用的是 5.4.2,但更改了它。两个版本中的问题似乎相同。

这是隐藏角色的常见copy/paste问题

在你的代码中,b的“1”的长度是2个字符

第一个字符是 unicode 8206 而第二个是 49 即 1

做一些清洁,它应该可以工作