我有这样的等级制度:
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;
为什么此转换无效?以及如何解决?
答案 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>