IFormattable等于方法没有正确的行为

时间:2019-01-15 14:03:58

标签: c# .net

在C#上,出现此问题的原因是图像。有谁知道为什么Equals实现没有给我预期的行为?是否应该因为值相同而返回true?

IFormattable Equals

2 个答案:

答案 0 :(得分:3)

由于FormattableString不会覆盖.Equals,并且从ConcreteFormattableString继承的FormattableString也不会覆盖,因此它会还原为Object.Equals,它比较引用是否相等,从而这就是为什么您当前的代码返回false的原因。 一种快速解决方案是在两个对象上调用.ToString()并使用string.Equals覆盖,因为它会比较每个字符串的值。

因此您可以将最后一行切换为此,并且它应该产生true:

Console.WriteLine(string.Equals(x.ToString(), u.ToString()));

文档:

string.Equals()https://docs.microsoft.com/en-us/dotnet/api/system.string.equals?view=netframework-4.7.2

FormattableStringhttps://docs.microsoft.com/en-us/dotnet/api/system.formattablestring?view=netframework-4.7.2

ConcreteFormattableStringhttps://weblogs.asp.net/dixin/csharp-6-0-string-interpolation-formattablestring-and-code-analysis-ca1305-specify-iformatprovider

答案 1 :(得分:2)

由于此分配,您的变量类型为ConcreteFormattableString

IFormattable x = $"string1"; // ConcreteFormattableString
var x = $"string1"; // this is regular string

并且ConcreteFormattableString不会覆盖Equals方法,因此调用了object.Equals方法来比较引用。由于两个字符串具有不同的引用,因此您得到false

如注释中所述,如果要比较字符串的内容,可以调用ToString,然后执行比较。