C#泛型类型相等运算符

时间:2015-03-09 22:08:44

标签: c# generics equality

来自https://msdn.microsoft.com/en-us/library/d5x73970.aspx

  

当应用where T:class约束时,避免使用==和!=   类型参数上的运算符,因为这些运算符将进行测试   仅参考标识,而不是价值平等。甚至是这种情况   如果这些运算符在一个用作的类型中重载   论点。以下代码说明了这一点;输出是   false,即使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);
}

一切顺利,直到我尝试跟随,使用相同的方法

static void Main()
{
    string s1 = "target";
    string s2 = "target";
    OpTest<string>(s1, s2);
}

它输出'True',s1和s2引用内存中的不同对象,即使它们具有相同的值对吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

字符串在.NET中实现,所以当你执行

string s1 = "target";
string s2 = "target";

他们都指向同一个对象。这就是MSDN示例使用StringBuilder的原因,这使得CLR无法创建具有相同值的另一个字符串对象,因此泛型方法中的运算符测试将返回false。