代码之家  ›  专栏  ›  技术社区  ›  David S.

为什么两个泛型类型不能与“==”进行比较?

  •  2
  • David S.  · 技术社区  · 14 年前

    下面是我的简单代码:

    T a;
    T b;
    
    if (a == b)
    // sth.
    else
    // sth. else
    

    当我试图编译时,我得到一个错误 == object.Equals() 方法。

    == 接线员打电话给 Equals object ? 为什么我可以使用 等于 == 接线员?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Igor Zevaka    14 年前

    operator == 必须在结构中重载才能使用,因此完全没有约束的类型参数不能使用它。可以将函数约束为 class

        public void Foo<T>() where T : class {
            T a = default(T);
            T b = a;
    
            if(a == b)
                System.Diagnostics.Debug.WriteLine("");
            else
                System.Diagnostics.Debug.WriteLine("");
        }
    

    operator == :

    对于字符串以外的引用类型, ==如果其两个操作数引用同一对象,则返回true。

    这就是为什么 if (new object() == new object()) {} 编译,即使 System.Object 不会过载 操作员== .

        2
  •  2
  •   Philip Rieck    14 年前

    ==运算符并没有定义T的所有可能值(或者我假设您对T施加了任何约束),所以您不能使用它。只能调用T上的运算符、方法和属性,这些运算符、方法和属性可以对T表示的所有可能类型进行调用。

    运算符==在许多情况下调用“Equals”,但这并不意味着它们是同一事物。

        3
  •  1
  •   supercat    11 年前

    == 标记用于表示C#中的两个不同运算符。只有当操作数的类型符合“相等检查”运算符的特定定义重载时,其中第一个才适用。第二个测试引用相等,仅当一个操作数为 null ,一个操作数是类类型,另一个是该类型的实例可以实现的接口,两者都是接口,都是相同的类类型,或者都是类类型,一个是另一个的超类型。第一种形式在泛型上不可用,除非泛型被约束到定义了相等检查重载的类型;第二种形式仅限于已知满足所示条件中的特定一种的引用类型。注意,在某些情况下,第二个操作符可以在第一个操作符的预期位置使用,例如。 bool IsSame<T>(T p1, T p2) where T:class { return p1==p2; } 将比较两个类型的变量 String 定义为 字符串 . 这是因为 T 字符串 过载 == ,但 == 已知是相同的引用类型。

    值得注意的是,其他一些语言使用不同的标记来执行C#使用的两个操作 . 例如,VB.NET使用 = 平等比较和 Is 供参考。