【问题标题】:C# generic types equality operatorC# 泛型类型相等运算符
【发布时间】:2015-03-09 22:08:44
【问题描述】:

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

应用 where T : class 约束时,避免使用 == 和 != 类型参数上的运算符,因为这些运算符将测试 仅参考身份,不用于价值平等。甚至是这种情况 如果这些运算符在用作 争论。下面的代码说明了这一点;输出是 即使 String 类重载 == 运算符,也是 false。

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引用内存中的不同对象,即使它们具有相同的值,对吗?我错过了什么吗?

【问题讨论】:

    标签: c# generics equality


    【解决方案1】:

    字符串在 .NET 中被保留,所以当你这样做时

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

    它们都指向同一个对象。这就是为什么 MSDN 示例使用 StringBuilder 的原因,这会欺骗 CLR 创建另一个具有相同值的字符串对象,以便泛型方法中的运算符测试将返回 false。

    【讨论】:

    • 这是正确的。可以在MSDN here 看到,“当两个或多个根据字符串相等运算符(第 7.9.7 节)等价的字符串文字出现在同一个程序集中时,这些字符串文字引用同一个字符串实例。”
    猜你喜欢
    • 2016-06-10
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2014-05-24
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多