我正在实现一个通用字典。我希望 TKey
是结构或类。如果它是一个结构,我想按值比较键,否则按引用。
我既不能使用 Object.Equals
(仅适用于结构)也不能使用 Object.ReferenceEquals
(仅适用于引用类型)。那我用什么方法来判断是否相等呢?
==
运算符可能会解决这个问题,但如果不为键指定任何约束(where TKey : ...
)我就无法使用它。我应该声明哪些接口(interface)?
最佳答案
I can't use neither Object.Equals (only works with structs) nor Object.ReferenceEquals (only works with reference types).
看来您可能只是误解了它们的工作原理。 System.Object.Equals()
无论是处理值类型还是引用类型,方法实现都同样有效(没有双关语意)。
对于值类型,它会逐个字段进行比较。如果被比较的两个值是相同的类型,并且它们的每个字段都具有相同的值,那么它们被认为是相等的。
对于引用类型,它只是使用引用相等性,正如您所希望的那样。
请注意,类型可以覆盖此方法,因此实际使用的实现可能与上述不同。例如,string
type 覆盖了方法,所以两个不是同一个实例的字符串仍然可以比较相等。但默认情况下,会发生上述情况。
最后我会指出,如果您想要的是一种完全像 Dictionary<TKey, TValue>
的行为类,最好的解决方案可能就是只使用该类。 :)
关于c# - 字典中结构键的值相等和类键的引用相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29720108/