将EqualityComparer <child <t >>转换为EqualityComparer <parent>

时间:2018-12-12 10:17:21

标签: c# generics inheritance casting iequalitycomparer

我有这样的等级制度:

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 :(得分:1)

为什么强制转换有效?

是什么使您相信TextView源自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

当您查看的类定义时  EqualityComparer<T>

public class Node<T> : Node, INode<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方法。

这对每个通用类均有效,例如看到这个相关的甚至重复的问题:

Cast Generic<Derived> to Generic<Base>

更新

之后,注意到Equals(object, object)被定义为IEqualityComparer<T>-因此可能是互逆的,您可以看一下:

Variance in generic Interfaces

您目前可以使用的另一种方法是,接口IEqualityComparer<in T>在类上不起作用。

IEqualityComparer<T>