mat*_*lat 2 c# generics dictionary equality reference
我正在实现一个通用字典.我想要TKey成为一个结构或类.如果它是一个结构,我想按值比较键,否则通过引用.
我不能既不使用Object.Equals(仅适用于结构),也不能Object.ReferenceEquals(仅适用于引用类型).那么我用什么方法来测试相等性呢?
==运算符可能会解决这个问题但我不能在没有为key(where TKey : ...)指定任何约束的情况下使用它.我应该声明什么接口?
我既不能使用Object.Equals(仅适用于结构),也不能使用Object.ReferenceEquals(仅适用于引用类型).
看起来你可能只是误解了这些是如何工作的.System.Object.Equals()无论是处理值类型还是引用类型,方法实现都同样有效(没有双关语).
对于值类型,它会进行逐个字段比较.如果要比较的两个值是相同的类型,并且它们的每个字段具有相同的值,则它们被认为是相等的.
对于引用类型,它只是使用引用相等,正如您所希望的那样.
请注意,类型可以覆盖此方法,因此使用的实际实现可能与上述不同.例如,string类型会覆盖该方法,因此两个不同实例的字符串仍然可以比较为相等.但默认情况下,上面就是这样.
最后我会注意到,如果你想要的是一个与类完全相同的行为Dictionary<TKey, TValue>,那么最好的解决方案就是使用该类.:)