Почему приведение должно быть действительным?
Что заставляет вас верить, что 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)
.
Это действительно для каждого универсального класса, например.см. этот связанный, возможно, даже повторяющийся вопрос:
Универсальный отлитый на Универсальный
Обновление:
После того, как вы заметили, что IEqualityComparer<T>
определено как IEqualityComparer<in T>
- так что возможна противоположность, вы можете взглянуть на это:
Дисперсия в универсальных интерфейсах
Возможен и другой способ, который есть у вас в данный момент: интерфейсы IEqualityComparer<T>
не работают в классе.
IEqualityComparer<INode> comparer = EqualityComparer<INode>.Default;
IEqualityComparer<INode<int>> intcomparer = comparer;