C#中泛型的比较

Sek*_*tor 6 c# generics

为什么这段代码打印错误?

    class Program
{
    public static void OpTest<T>(T s, T t) where T : class
    {
        Console.WriteLine(s == t);
    }

    static void Main()
    {
        string s1 = "string";
        System.Text.StringBuilder sb = new System.Text.StringBuilder(s1);
        string s2 = sb.ToString();
        OpTest(s1, s2);
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否正确理解,相比之下,它们不是作为字符串进行比较,而是作为对象进行比较,这就是为什么不比较它们的值,而是它们指向的地址?

Dav*_*idG 3

来自操作员的文档==

对于预定义值类型,相等运算符 ( ==)true如果其操作数的值相等则返回,false否则返回。对于 以外的引用类型string,如果其两个操作数引用同一个对象,==则返回。true对于string类型,==比较字符串的值。

由于T不能保证它是泛型的值类型,因此编译器必须假设它是引用类型。