结构键的值相等和字典中类键的引用相等性

mat*_*lat 2 c# generics dictionary equality reference

我正在实现一个通用字典.我想要TKey成为一个结构或类.如果它是一个结构,我想按值比较键,否则通过引用.

我不能既不使用Object.Equals(仅适用于结构),也不能Object.ReferenceEquals(仅适用于引用类型).那么我用什么方法来测试相等性呢?

==运算符可能会解决这个问题但我不能在没有为key(where TKey : ...)指定任何约束的情况下使用它.我应该声明什么接口?

Pet*_*iho 6

我既不能使用Object.Equals(仅适用于结构),也不能使用Object.ReferenceEquals(仅适用于引用类型).

看起来你可能只是误解了这些是如何工作的.System.Object.Equals()无论是处理值类型还是引用类型,方法实现都同样有效(没有双关语).

对于值类型,它会进行逐个字段比较.如果要比较的两个值是相同的类型,并且它们的每个字段具有相同的值,则它们被认为是相等的.

对于引用类型,它只是使用引用相等,正如您所希望的那样.

请注意,类型可以覆盖此方法,因此使用的实际实现可能与上述不同.例如,string类型会覆盖该方法,因此两个不同实例的字符串仍然可以比较为相等.但默认情况下,上面就是这样.

最后我会注意到,如果你想要的是一个与类完全相同的行为Dictionary<TKey, TValue>,那么最好的解决方案就是使用该类.:)