为什么String.Equals返回false?

Mar*_*ila 23 c# string comparison equality

我有以下C#代码(来自我正在使用的库)试图找到比较指纹的证书.请注意,在下面的代码都mycert.ThumbprintcertificateThumbprint都是字符串.

var certificateThumbprint = AppSettings.CertificateThumbprint;

var cert =
    myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
      mycert => 
      mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint)
      );
Run Code Online (Sandbox Code Playgroud)

这无法找到带有指纹的证书,因为即使字符串相等mycert.Thumbprint.Equals(certificateThumbprint)也是false如此.mycert.Thumbprint == certificateThumbprint也返回false,同时mycert.Thumbprint.CompareTo(certificateThumbprint)返回0.

在此输入图像描述

我可能会遗漏一些明显的东西,但我无法弄清楚为什么Equals方法失败了.想法?

brz*_*brz 21

CompareTo忽略某些字符:

static void Main(string[] args)
{
    var a = "asdas"+(char)847;//add a hidden character
    var b = "asdas";
    Console.WriteLine(a.Equals(b)); //false
    Console.WriteLine(a.CompareTo(b)); //0
    Console.WriteLine(a.Length); //6
    Console.WriteLine(b.Length); //5

   //watch window shows both a and b as "asdas"
}
Run Code Online (Sandbox Code Playgroud)

(这里添加的角色aU+034F,结合Grapheme Joiner.)

调试模式

因此,CompareTo的结果并不是Equals中错误的良好指标.您问题的最可能原因是隐藏的字符.您可以检查长度以确定.

有关详细信息,请参阅