通用接口的类型不可知实现

问题描述

我有一些覆盖 EqualsGetHashCode 的类,但我不时需要通过引用进行比较。所以我写了一个 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 (将#修改为@)