问题描述
我有一些覆盖 Equals
和 GetHashCode
的类,但我不时需要通过引用进行比较。所以我写了一个 ReferenceEqualityComparer
像这里:https://stackoverflow.com/a/35520207/5333340
请注意,ReferenceEqualityComparer
实现了 IEqualityComparer<object>
。
由于它的逆变性,我不限于 object
的集合,即我可以写
ISet<MyClass> setofMyClass = new HashSet<MyClass>(ReferenceEqualityComparer.Default);
。但似乎在某些情况下,逆变将无济于事:我想在方法中使用我的 ReferenceEqualityComparer
Enumerable.ToDictionary<TSource,TKey,TElement>(this IEnumerable<TSource> source,Func<TSource,TKey> keySelector,TElement> elementSelector,IEqualityComparer<TKey> comparer)
像这样(只是一个小的技术示例,我知道在这里使用 ReferenceEqualityComparer
没有意义):
var foo = new List<string> {"hello","world","to","everyone"}
Dictionary<string,int> dict = foo.ToDictionary(x => x,x => x.Length,ReferenceEqualityComparer.Default);
不幸的是,这不起作用。由于 ReferenceEqualityComparer
实现了 IEqualityComparer<object>
,因此生成的字典将是 Dictionary<object,int>
类型(这是 Visual Studio 告诉我的)。所以如果我理解正确的话,为了得到 Dictionary<string,int>
,ReferenceEqualityComparer
需要实现 IEqualityComparer<string>
。
那么我如何使 ReferenceEqualityComparer
与类型无关,即让它为所有可能的类型 IEqualityComparer<T>
实现 T
?
或者我把一些东西弄混了,还有另一种方法吗?我对理论概念不太感兴趣,我只是想在需要泛型类的上下文中以某种方式使用非泛型类(此处:ReferenceEqualityComparer
)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)