C# UInt32.TryParse()十六进制数不起作用

C# UInt32.TryParse()十六进制数不起作用,c#,tryparse,C#,Tryparse,出于某种原因,以下C#控制台程序总是输出: 32 假 wtf=0 我做错了什么 using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; namespace ConsoleApplication1 { class Program { static void Main(string[] args) {

出于某种原因,以下C#控制台程序总是输出:

32

wtf=0

我做错了什么

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Convert.ToUInt32("0x20", 16));
            UInt32 wtf = 0;
            Console.WriteLine(UInt32.TryParse("0x20",
                              NumberStyles.HexNumber, // I've tried also AllowHexSpecifier
                              CultureInfo.InvariantCulture,  // I've also tried CurrentCulture
                              out wtf));
            Console.WriteLine("wtf={0}", wtf);
        }
    }
}
您需要删除“0x”前缀。请参见摆脱您试图解析的字符串中的前导“0x”。

另请参见 在页面底部的示例中:

尝试转换“0x8F8C”失败


你完全正确。那么,每个C#程序员是手动“修剪”任何“0x”(如果存在)还是有捷径?顺便说一句:我会接受这个解决方案,只要你允许我:-)哇。我会说这几乎是一个bug。@s.C.马德森:我想我在以前的项目中需要这个功能时,是“手动”修剪的。不漂亮,但效果很好……彼得:我在申请表上也这么做了。我真的认为这是TryParse()方法的一个主要缺点。From,allowehexspecifier:使用这种样式解析的字符串不能以“0x”或“&h”作为前缀。IIRC,Java也有同样的愚蠢之处。尽管它的名称,
allowehexspecifier
不允许任何十六进制说明符。它只是把这个东西解释成十六进制-/为什么不为前2个字符设置子字符串?如果该值为“0XFFFF”,该怎么办?我想你也可以
.toLower()
字符串
// stupid but effective way to improve the parsing
char[] _trim_hex = new char[] {'0','x'};
int temp;

if (int.TryParse(value.TrimStart(_trim_hex), NumberStyles.HexNumber, null, out temp))
{
    // temp is good
}