C# · 12月 23, 2021

c# – 通用约束:我可以测试可以是引用还是值类型的泛型的平等?

我想要一个可以接受引用或值类型的通用类,只能基于相等性测试执行操作.考虑以下几点: public class Property<TProp> where TProp : struct,IEquatable<TProp>{ public TProp Value; public void SetValue(ObservableObject owner,TProp value) { if (!Value.Equals(value)) // cannot use != on struct constrained TProp { // … set the property } }}public class ByRefProperty<TProp> where TProp : class // Dont want to require IEquatable<> on reference type TProp{ public TProp Value; public void SetValue(ObservableObject owner,TProp value) { if (Value != value) { // … set the property } }}

我不得不使用通用约束和两个类来测试值类型相对于参考类型的相等性.有没有办法让我只有一个班?

我不是特别想要一个涉及拳击价值类型,使用反射或运行时IL生成的解决方案.有没有一个简单的解决方案,我错过了这里?

解决方法 最好的办法是一般为 EqualityComparer<T>.Default: public void SetValue(ObservableObject owner,TProp value){ if (!EqualityComparer<TProp>.Default.Equals(Value,value)) { // … set the property }}

请注意,这甚至以逻辑方式为您处理空值(null等于null但没有其他).