为什么我得到与List <Char>中相反的情况.Contains(char)

Aus*_*nch 0 c# linq list char utf

我在两个应用程序中对此进行了测试 我在哪里传递一个寻找特殊角色的字符.

        static void Main(string[] args)
        {
            ConsoleKeyInfo entered = Console.ReadKey();
            char asChar = Convert.ToChar(entered.KeyChar);
            Console.WriteLine(IsSpecialChar(asChar));

            Console.ReadKey();
        }

        private static string IsSpecialChar(char dWord)
        {
            List<char> Special = new List<char>();

            System.Globalization.NumberStyles hexer = System.Globalization.NumberStyles.HexNumber;
            Special.AddRange(Enumerable.Range((int.Parse("21", hexer)), int.Parse("2f", hexer)).Select(x => Convert.ToChar(x)));
            Special.AddRange(Enumerable.Range((int.Parse("3a", hexer)), int.Parse("40", hexer)).Select(x => Convert.ToChar(x)));
            Special.AddRange(Enumerable.Range((int.Parse("5c", hexer)), int.Parse("60", hexer)).Select(x => Convert.ToChar(x)));
            Special.AddRange(Enumerable.Range((int.Parse("7e", hexer)), int.Parse("7e", hexer)).Select(x => Convert.ToChar(x)));

            if (Special.Contains(Convert.ToChar(dWord)))
            {
                return "Special";
            }
            else return "NA";
        }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,Special.Contains总是看到与真实相反的东西.

填充的一些字符是:

U+003F  ?   3f  QUESTION MARK
U+0040  @   40  COMMERCIAL AT
U+0041  A   41  LATIN CAPITAL LETTER A
U+0042  B   42  LATIN CAPITAL LETTER B
Run Code Online (Sandbox Code Playgroud)

字母A和B不应该在那里.到底是怎么回事?

Ser*_*rvy 7

Enumerable.Range接受范围的开始和范围的长度,而不是范围的开始和范围的结束.

因此,您的范围根本不是您想要的范围.