为什么演员表应该是有效的?
是什么让您相信EqualityComparer<T> 源自EqualityComparer<Random base class/interface of T> 或EqualityComparer<every possible base class/interface of T>?
你不能和这个比较:
Node<string> stringNode;
Node node = stringNode;
这是有效的,因为 Node<T> 的类定义明确派生自 Node 的非泛型版本
public class Node<T> : Node, INode<T>
当您查看类定义时
EqualityComparer<T>
public abstract class EqualityComparer<T> :
System.Collections.Generic.IEqualityComparer<T>,
System.Collections.IEqualityComparer
您可以看到没有非通用版本,但您可以将代码更改为他的:
EqualityComparer<INode<int>> intcomparer = EqualityComparer<INode<int>>.Default;
IEqualityComparer comparer = intcomparer;
但是,IEqualityComparer 将没有关于您的INode 的信息,并且只定义了一个Equals(object, object) 方法。
这对每个泛型类都有效,例如。看到这个相关的,甚至可能是重复的问题:
Cast Generic<Derived> to Generic<Base>
更新:
之后,注意到IEqualityComparer<T> 被定义为IEqualityComparer<in T> - 所以逆变是可能的,你可以看看这个:
Variance in generic Interfaces
您目前的其他方式是可能的,接口IEqualityComparer<T> 在课堂上不起作用。
IEqualityComparer<INode> comparer = EqualityComparer<INode>.Default;
IEqualityComparer<INode<int>> intcomparer = comparer;