我有以下 C# 代码(来 self 正在使用的库)试图找到比较指纹的证书。请注意,在以下代码中,mycert.Thumbprint
和 certificateThumbprint
都是字符串。
var certificateThumbprint = AppSettings.CertificateThumbprint;
var cert =
myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
mycert =>
mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint)
);
这无法找到带有指纹的证书,因为即使字符串相等,mycert.Thumbprint.Equals(certificateThumbprint)
也是 false
。 mycert.Thumbprint == certificateThumbprint
也返回 false
,而 mycert.Thumbprint.CompareTo(certificateThumbprint)
返回 0。
我可能遗漏了一些明显的东西,但我无法弄清楚为什么 Equals
方法会失败。想法?
最佳答案
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"
}
(这里a
后面加的字符是U+034F
,Combining Grapheme Joiner.)
所以 CompareTo 的结果并不是 Equals 中错误的良好指标。您的问题最可能的原因是隐藏字符。您可以检查长度以确定。
参见 this了解更多信息。
关于c# - 为什么 String.Equals 返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25999031/