【发布时间】:2020-03-25 01:30:54
【问题描述】:
我有课:
public class A : IEquatable<A>
{
...
public bool Equals(A data) { ... }
}
public class B
{
...
}
以及自定义作业的通用类
public class CommonFilter<T>
{
public T GetBy(T data) {
var item = list.FirstOrDefault(s=> s?.Equals(data) == true);
...
}
}
list 如果List<T> 输入。
CommonFilter<A> cmA = GetFilter();
var result = cmA.GetBy(data);
在调试模式下,如果我有 CommonFilter<A> 这样的对象,我希望在 LINQ 中使用 A 类中的 Equals 方法,但事实并非如此。
如何做到这一点?
【问题讨论】:
-
您还需要在
A中覆盖Equals(object)。 -
我知道因为我在VS 2019中放了断点,所以没有到达
-
IIRC,
EqualityComparer<T>.Equals(s, data)应该选择正确的Equals。 -
如果没有好的minimal reproducible example,就不可能确定您的代码为什么不起作用。但是,很可能您还没有在您的类型中完全实现平等。有关如何正确执行此操作的详细信息,请参阅标记重复以及 Stack Overflow 上数百个其他与相等相关的问题。如果您在查看所有这些材料后仍然遇到问题,请发布一个新问题,但这次请确保您提供正确的minimal reproducible example,该minimal reproducible example 可以可靠地重现问题,并说明您可以具体做什么'想不通。
-
此外,您的调用站点可能根本无法访问完整的类型信息,因此调用了错误的
Equals()方法。如果您正确实现了相等性,这将不是问题(因为object.Equals()方法与接口方法一样有效,尽管有装箱开销),但如果您正确声明约束,您可以摆脱它。查看该特定问题的其他标记重复项。
标签: c#