【发布时间】:2021-09-23 17:07:23
【问题描述】:
让我们考虑以下简单的实现来检查一个类型是否具有正确的 HashSet EqualityComparer<T>.Default 实现:
bool IsHashEqual<T>(Func<T> f) where T : struct, IEquatable<T>
{
var set = new HashSet<T>();
set.Add(f());
set.Add(f());
return set.Count == 1;
}
我们可以验证以下内容:
Assert.True(IsHashEqual(() => 42));
Assert.True(IsHashEqual(() => 3.14));
Assert.True(IsHashEqual(() => true));
通过一些工作,我们可以扩展上面的IsHashEqual 代码并在string 类上验证此属性。
但是我们可以让上面的代码失败,比如:
Assert.False(IsHashEqual(() => ImmutableArray.Create(new byte[] { 0, 1, 2, 3 })));
如何修改我的通用约束,使其符合默认相等比较器 (EqualityComparer<T>.Default) 的期望?否则我可以从T 类型推断出我需要使用StructuralComparisons.StructuralEqualityComparer 吗?
参考资料:
【问题讨论】: