繁体   English   中英

转换EqualityComparer <Child<T> &gt;进入EqualityComparer <Parent>

[英]Convert EqualityComparer<Child<T>> into EqualityComparer<Parent>

我有这样的层次结构:

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;

为什么这种转换无效? 以及如何解决?

为什么强制转换有效?

是什么让您相信EqualityComparer<T>源自EqualityComparer<T> EqualityComparer<Random base class/interface of T>EqualityComparer<every possible base class/interface of 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)方法。

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

将Generic <Derived>强制转换为Generic <Base>

更新:

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

通用接口中的差异

当前的另一种解决方法是可行的,因为IEqualityComparer<T>接口不适用于类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM