c# - 在 C# 中使用泛型类型时使用正确的 Equals 方法
问题描述
我有课:
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 中使用类中的Equals
方法A
,但事实并非如此。
如何做到这一点?
解决方案
正如 Jasper 指出的那样,您缺少一个通用约束:
public class CommonFilter<T> where T : IEquatable<T>
其他答案中没有解释的是为什么需要它。
请记住,编译器需要s?.Equals(data)
在编译时解析调用。在您的代码中,编译器一无所知T
,因此将调用解析为 any 的唯一可能候选者T
:object.Equals
默认为引用比较。
另一方面,如果您定义了约束,则编译器知道任何给定T
的必须实现更具体的IEquatable<T>.Equals
,并将解析对该方法的调用。
如果定义约束是一项重大更改,或者您根本无法实现它,因为您还需要处理引用相等性合适的数据,那么您可以在内部分支GetBy
是否T
实现IEquatable<T>
,类型检查泛型类型通常是一个危险信号,但是在这种特定情况下,这可能是合理的。
如果可能的话,我更喜欢第一个选项,因为这样你特别禁止使用GetBy
未实现的类型IEquatable<T>
。
推荐阅读
- azure - 无法在 Azure 中使用 CosmosDB Binding 作为 SpringBoot App 运行时间触发函数
- python - 选择一些行作为一个组,然后在 txt 文件中的同一组中为每一行赋予相同的标签
- postgresql - postgres_fdw 每天刷新 500 万行是否可靠?
- symfony - Symfony 3.4 entity property with array of items from another entity
- php - 如何在 PHP 中进行 api 调用
- r - 我需要帮助为主题建模整理数据
- c# - 数组作为字典键会产生很多冲突
- flutter - BuiltValue 不是“BuiltRegister”错误类型的子类型
- java - 我的 SelectionSort 方法出现一个我无法弄清楚的错误
- php - 在功能性(非面向类)文件中简单导入