Ahm*_*car 6 c# generics equality
来自https://msdn.microsoft.com/en-us/library/d5x73970.aspx
在应用where T:class约束时,请避免使用type参数上的==和!=运算符,因为这些运算符将仅测试引用标识,而不是值相等.即使这些运算符在用作参数的类型中重载,也是如此.以下代码说明了这一点; 即使String类重载==运算符,输出也是假的.
public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(s == t);
}
static void Main()
{
string s1 = "target";
System.Text.StringBuilder sb = new System.Text.StringBuilder("target");
string s2 = sb.ToString();
OpTest<string>(s1, s2);
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到我尝试跟随,用同样的方法
static void Main()
{
string s1 = "target";
string s2 = "target";
OpTest<string>(s1, s2);
}
Run Code Online (Sandbox Code Playgroud)
它输出'True',s1和s2引用内存中的不同对象,即使它们具有相同的值对吗?我错过了什么吗?
字符串在.NET中实现,所以当你这样做时
string s1 = "target";
string s2 = "target";
Run Code Online (Sandbox Code Playgroud)
他们都指向同一个对象.这就是MSDN示例使用a的原因StringBuilder,这使得CLR无法创建具有相同值的另一个字符串对象,因此泛型方法中的运算符测试将返回false.