C#String.Equals在相同的字符串上返回false

Kob*_*bek -1 c# string compare equals-operator

我正在研究一个项目,其中一部分需要比较2个字符串.我的问题是,每当我尝试比较它们时,我总是得到假(==, .Equals(), String.Equals()- 它们都返回假,即使我有两个完全相同的字符串)

这是我的代码的一部分.

var tagType = JObject.Parse(json).First.First.ToString();
foreach (var type in assembly.ExportedTypes)
{
    var name = tagType;
    var currentType = type.Name;

    var a = name.Length;
    var b = currentType.Length;

    var result = currentType == name;
    var result1 = currentType.Equals(name);
    var result2 = String.Equals(name, currentType, StringComparison.CurrentCulture);
    var result3 = String.Equals(name, currentType, StringComparison.InvariantCulture);
    var result4 = String.Equals(name, currentType, StringComparison.Ordinal);
    var result5 = String.Equals(name, currentType, StringComparison.CurrentCultureIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)

现在在调试我的时候foreach,我最终达到了一个名称,currentType两者都相同的字符串 - "AutoIncrementTag".在同一点上,它们的长度(a和b)相等--16个字符.

这是调试输出的样子:

//name -        "AutoIncrement??g"
//currentType - "AutoIncrementTag"

//a - 16
//b - 16

// result - false
// result1 - false
// result2 - false
// result3 - false
// result4 - false
// result5 - false
Run Code Online (Sandbox Code Playgroud)

以下所有比较都返回false.

我甚至尝试用"name"和currenType创建一个新的字符串.没别的了.

我真的被困在这里了.两个相同的字符串(相同的长度,因此没有隐藏的字符)如何通过任何类型的比较返回false.

mjw*_*lls 5

最后的第二个和第三个字符不一样.

最后一个字符之一是http://www.fileformat.info/info/unicode/char/0061/index.htm,另一个是http://www.fileformat.info/info/unicode/char/0430/ index.htm.它们看起来一样,但实际上并不相同.

要查看它,请运行此程序:

using System;

namespace ConsoleApplication4
{
    class Program
    {
        static string GetEscapeSequence(char c)
        {
            return "\\u" + ((int)c).ToString("X4");
        }

        static void Main(string[] args)
        {
            var name = "AutoIncrement??g";
            var currentType = "AutoIncrementTag";

            foreach (var character in name)
            {
                Console.WriteLine(GetEscapeSequence(character));
            }

            Console.WriteLine("second string");
            foreach (var character in currentType)
            {
                Console.WriteLine(GetEscapeSequence(character));
            }

            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)