为什么当我与 == 比较时,List<T>.RemoveAll 没有删除任何项目?

Why doesn't List<T>.RemoveAll remove any items when I compare with ==?

我有一个奇怪的问题。不知何故,此代码不会删除任何项目:

    public static int RemoveAll<T>(this List<T> container, T item) where T : class
    {
       return container.RemoveAll(i => i == item));
    }

尽管我在 VS Watch Window 中获得了 (i == item): true 中的一些。

当我像这样重写代码时,它确实出错了...

    public static int RemoveAll<T>(this List<T> container, T item)
    {
        int n = 0;
        while (container.Remove(item)) { ++n; }
        return n;
    }

我是否遗漏了关于 this List<T> 按值传递的秘密?该列表在函数内部也不会改变。

我是这样称呼它的:

    List<string> completedTasks = new List<string>();
    string taskId = ...;
    ...
    completedTasks.RemoveAll(taskId);

第一个方法使用 == 运算符(其中两个参数都是 object,请注意,通用方法将无法为该特定类型找到此运算符的任何重载)。第二种方法使用object.Equals.

因此,第一个方法将始终比较两个对象的引用,看它们是否引用同一个对象,第二个方法执行 Equals 方法被重写的任何操作。由于在这种情况下您似乎想使用 Equals 方法来实现相等(因为您已经声明这是具有正确结果的方法),所以您只需要使用 object.Equals 而不是 == 当使用 RemoveAll 得到正确的结果时。