Конвертировать EqualityComparerв EqualityComparer <Parent> - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть такая иерархия:

public interface INode
{
    //...
}

public interface INode<T> : INode
{
    //...
}

public class Node : INode
{
    //...
}

public class Node<T> : Node, INode<T>
{
    //...     
}

Теперь я хочу разыграть так:

EqualityComparer<INode<int>> intcomparer = EqualityComparer<INode<int>>.Default;
EqualityComparer<INode> comparer = intcomparer;

Почему это приведение недействительно?и как это исправить?

1 Ответ

0 голосов
/ 12 декабря 2018

Почему приведение должно быть действительным?

Что заставляет вас верить, что 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;
...